Различия в асинхронных VB.NET и C #? - PullRequest
0 голосов
/ 16 апреля 2010

Итак, на этой неделе я публиковал справку по API с асинхронными вызовами. Вы можете просмотреть CODE здесь: C # процедура асинхронного события не запускается

Немного покопавшись, я обнаружил, что API написан на VB.NET, и создал пример VB.NET, и угадайте, что. , , асинхронные вызовы работают как шарм.

Итак, теперь мне нужно выяснить, почему вызовы не запускаются в коде C #, который у меня есть. API, написанный на VB, действительно не должен иметь значения, но, опять же, код VB.NET работает, а мой C # - нет. Есть ли проблема с обработчиком событий и как он объявляется, из-за чего он не срабатывает?

ОБНОВЛЕНИЕ VB Код добавлен

Imports ClientSocketServices
Imports DHS_Commands
Imports DHS
Imports Utility
Imports SocketServices

Class Window1

    Public WithEvents AppServer As New ClientAppServer
    Public Token As LoginToken

    Private Sub login()

        Dim handler As New LoginHandler
        Token = handler.RequestLogin("admin", "admin", localPort:=12000, serverAddress:="127.0.0.1", serverLoginPort:=11000, clienttype:=LoginToken.eClientType.Client_Admin, timeoutInSeconds:=20)

        If Token.Authenticated Then
            AppServer = New ClientAppServer(Token, True)
            AppServer.RetrieveCollection(GetType(Gateways))
        End If

    End Sub

    Private Sub ReceiveMessage(ByVal rr As RemoteRequest) Handles AppServer.ReceiveRequest

        If TypeOf (rr.TransferObject) Is Gateways Then
            MsgBox("dd")
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        login()
    End Sub
End Class

Ответы [ 2 ]

4 голосов
/ 16 апреля 2010

Ваш код VB сильно отличается от вашего кода C #.
Попробуйте преобразовать ваш VB-код в C #, но имейте в виду, что вы не получаете WithEvents, поэтому каждый раз, когда вы
AppServer = New ClientAppServer(Token, True);
вам нужно будет
AppServer.ReceiveRequest += ReceiveMessage;


РЕДАКТИРОВАТЬ: я преобразовал ваш код, используя http://www.developerfusion.com/tools/convert/vb-to-csharp/ Я также отредактировал его вручную, чтобы события работали. Имейте в виду, что я не проверял это; Я прошу прощения за любые опечатки / и т.д.

Мне также интересно, действительно ли происходит нажатие вашей кнопки? Где добавлен обработчик событий, чтобы убедиться, что он действительно находится в вашем IntializeComponent?


using DHS;
using Utility;
using SocketServices;

class Window1
{
    
    public ClientAppServer AppServer = new ClientAppServer();
    public LoginToken Token;
    

    public Window1()
    {
      InitializeComponent();
    }

    private void login()
    {
        
        LoginHandler handler = new LoginHandler();
        Token = handler.RequestLogin("admin", "admin", localPort = 12000, serverAddress = "127.0.0.1", serverLoginPort = 11000, clienttype = LoginToken.eClientType.Client_Admin, timeoutInSeconds = 20);
        
        if (Token.Authenticated) {
            AppServer = new ClientAppServer(Token, true);
            AppServer.ReceiveRequest += ReceiveMessage;
            AppServer.RetrieveCollection(typeof(Gateways));
            
        }
    }
    
    private void ReceiveMessage(RemoteRequest rr)
    {
        
        if ((rr.TransferObject) is Gateways) {
            MessageBox.Show("dd");
            
        }
    }
    
    private void Button1_Click(System.Object sender, System.Windows.RoutedEventArgs e)
    {
        login();
    }
}
1 голос
/ 17 апреля 2010

Большое спасибо Коллину Соуву за то, что он поставил меня на правильный путь с отражателем. Ключ был в том, как создавался объект AppServer. Рабочий код для этого приведен ниже.

 public virtual ClientAppServer AppServer
    {

        get
        {
            return this._AppServer;
        }

        set
        {
            ClientAppServer.ReceiveRequestEventHandler handler = new ClientAppServer.ReceiveRequestEventHandler(this.ReceiveMessage);
            if (this._AppServer != null)
            {
                this._AppServer.ReceiveRequest -= handler;
            }
            this._AppServer = value;
            if (this._AppServer != null)
            {
                this._AppServer.ReceiveRequest += handler;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...