2010-10-15 2 views
2

Я пытаюсь написать простое/небольшое приложение Windows Communication Foundation в Visual Basic (но я очень новичок в VB), и все хорошие примеры, которые я нашел в сети написаны на C#. До сих пор я получил свое служебное приложение WCF, но теперь я пытаюсь добавить функциональность обратного вызова, и программа усложнилась. В примере кода C# я понимаю, как все работает, но у меня возникают проблемы с переводом на VB части кода, в которой используется делегат. Может кто-нибудь, пожалуйста, показать эквивалент VB?Перевод приложения C# WCF в Visual Basic

Вот пример # код C Я использую для справки:

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; 
      } 
     } 
    }   
} 

Я думал, что я мог бы сделать что-то вроде этого, но я не знаю, как передать строку сообщения от AddMessage к 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

Значит, вы не знаете 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 
+0

Теперь вы выбрали все самое интересное! – bzlm

+0

Спасибо! Это огромная помощь. – zzMzz

1

Лично я использую Telerik Converter. Он может даже делать массовые конверсии на загруженные файлы.

+0

Конвертер Telerik довольно горький. – Jeremy