tags:

views:

27

answers:

3

Hi -

I'm trying to write a simple/small Windows Communication Foundation service application in Visual Basic (but I am very novice in VB) and all the good examples I've found on the net are written in C#. So far I've gotten my WCF service application working but now I'm trying to add callback functionality and the program has gotten more complicated. In the C# example code I understand how everything works but I am having trouble translating into VB the portion of code that uses a delegate. Can someone please show the VB equivalent?

Here is the C# code sample I'm using for reference:

namespace WCFCallbacks { using System; using System.ServiceModel;

[ServiceContract(CallbackContract = typeof(IMessageCallback))]
public interface IMessage
{
    [OperationContract]
    void AddMessage(string message);

    [OperationContract]
    bool Subscribe();

    [OperationContract]
    bool Unsubscribe();
}

interface IMessageCallback
{
    [OperationContract(IsOneWay = true)]
    void OnMessageAdded(string message, DateTime timestamp);
}

}

namespace WCFCallbacks { using System; using System.Collections.Generic; using System.ServiceModel;

public class MessageService : IMessage
{
    private static readonly List<IMessageCallback> subscribers = new List<IMessageCallback>();

    //The code in this AddMessage method is what I'd like to see re-written in VB...
    public void AddMessage(string message)
    {

        subscribers.ForEach(delegate(IMessageCallback callback)
        {
            if (((ICommunicationObject)callback).State == CommunicationState.Opened)
            {
                callback.OnMessageAdded(message, DateTime.Now);
            }
            else
            {
                subscribers.Remove(callback);
            }
        });
    }

    public bool Subscribe()
    {
        try
        {
            IMessageCallback callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
            if (!subscribers.Contains(callback))
                subscribers.Add(callback);
            return true;
        }
        catch
        {
            return false;
        }
    }

    public bool Unsubscribe()
    {
        try
        {
            IMessageCallback callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
            if (!subscribers.Contains(callback))
                subscribers.Remove(callback);
            return true;
        }
        catch
        {
            return false;
        }
    }
}

}


I was thinking I could do something like this but I don't know how to pass the message string from AddMessage to DoSomething...

    Dim subscribers As New List(Of IMessageCallback)

Public Sub AddMessage(ByVal message As String) Implements IMessage.AddMessage

    Dim action As Action(Of IMessageCallback)
    action = AddressOf DoSomething
    subscribers.ForEach(action)

    'Or this instead of the above three lines:
    'subscribers.ForEach(AddressOf DoSomething)

    End Sub

Public Sub DoSomething(ByVal callback As IMessageCallback)

           'I am also confused by:
           '((ICommunicationObject)callback).State
           'Is that casting the callback object as type ICommunicationObject? How is that done in VB?

End Sub
+1  A: 

So you don't know the secret converter?

Public Class MessageService
    Implements IMessage
    Private Shared ReadOnly subscribers As New List(Of IMessageCallback)()

    'The code in this AddMessage method is what I'd like to see re-written in VB...
    Public Sub AddMessage(message As String)

        subscribers.ForEach(Function(callback As IMessageCallback) Do
            If DirectCast(callback, ICommunicationObject).State = CommunicationState.Opened Then
                callback.OnMessageAdded(message, DateTime.Now)
            Else
                subscribers.Remove(callback)
            End If
        End Function)
    End Sub

    Public Function Subscribe() As Boolean
        Try
            Dim callback As IMessageCallback = OperationContext.Current.GetCallbackChannel(Of IMessageCallback)()
            If Not subscribers.Contains(callback) Then
                subscribers.Add(callback)
            End If
            Return True
        Catch
            Return False
        End Try
    End Function

    Public Function Unsubscribe() As Boolean
        Try
            Dim callback As IMessageCallback = OperationContext.Current.GetCallbackChannel(Of IMessageCallback)()
            If Not subscribers.Contains(callback) Then
                subscribers.Remove(callback)
            End If
            Return True
        Catch
            Return False
        End Try
    End Function
End Class
klausbyskov
Now you took all the fun out of it!
bzlm
Thanks! That is a huge help.
MikeG
A: 

The online C# to VB conversion tool here: http://www.developerfusion.com/tools/convert/csharp-to-vb/ converts your code successfully.

RichieHindle
+1  A: 

I personally use the Telerik Converter - It can even do bulk conversions on uploaded files.

rockinthesixstring