等待另一个方法调用,然后继续结果

ᔕIᑎ*_*ᑎᗪI 5 c# invoke

我正在尝试从另一个 .dll 文件调用方法。它通过 VPN 发送消息,然后从另一台计算机返回 RecievedMessage。

正如您现在发送和接收消息需要时间,VpnObject只是发送消息,我应该等待侦听器调用 RecievedMessage。

这个方法是这样的!

    public string RecievedMessage()
    {
        string Recieved ;
        // Some VPN Code  and then return the result;
        return Recieved;
    }

    public string SendAndRecieveMessage(string MessageToSend)
    {
        string RecievedAnswer = string.Empty;

        // Now Sending Message through the VPN
        VpnObject.SendMessage(MessageToSend);

        //Then want to Recieve the answer and return the answer here .

        return RecievedAnswer;
    }
Run Code Online (Sandbox Code Playgroud)

我只是在想如何等待RecievedMessage调用然后返回结果。

您知道使用变量并为其赋值和检查很简单,while但它会显着降低性能。

有没有办法从调用SendAndRecieveMessage时继续RecievedMessage?(我认为这是 async 和 await 但不知道如何!)

编辑:VpnObject 只是通过 vpn 的发送者和接收者。它包含一个简单的套接字发送和一个侦听器,用于在收到新消息时调用方法 (RecievedMessage)。

Asa*_*din 2

是否有轮询的替代方案取决于您使用的库是否提供任何事件或回调来告诉您请求何时完成。

无论哪种方式,公开异步操作的延迟结果的标准方法是使用Task. 您的方法签名将如下所示:

public Task<string> SendAndRecieveMessage(string MessageToSend)
Run Code Online (Sandbox Code Playgroud)

现在,如何实际实现该方法取决于VpnObject公开的 API。TaskCompletionSource对于这种事情非常有用。

如果VpnObject有一个在请求完成时触发的事件:

public Task<string> SendAndReceiveMessage(string messageToSend)
{
    var tcs = new TaskCompletionSource<string>();
    ...
    VpnObject.OnMessageReceived += (s, e) => tcs.SetResult(e.Message);
    ...
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

如果VpnObject可以接受请求完成时将调用的回调:

public Task<string> SendAndReceiveMessage(string messageToSend)
{
    var tcs = new TaskCompletionSource<string>();
    ...
    VpnObject.OnMessageReceived(message => tcs.SetResult(message));
    ...
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

如果VpnObject不支持其中任何一个,您可以退回到轮询:

public async Task<string> SendAndReceiveMessage(string messageToSend)
{
    var tcs = new TaskCompletionSource<string>();
    ...
    while(!VpnObject.IsMessageReceived)
        await Task.Delay(500); // Adjust to a reasonable polling interval
    ...
    return VpnObject.Message;
}
Run Code Online (Sandbox Code Playgroud)