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

时间:2015-07-12 16:37:29

标签: 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;
    }

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

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

无论如何,只有在调用SendAndRecieveMessage时从RecievedMessage继续? (我认为这是异步和等待但不知道如何!)

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

2 个答案:

答案 0 :(得分:2)

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

无论哪种方式,暴露异步操作的延迟结果的标准方法是使用$mydict = {"1":"one", "5":"five", "5":"six"}; $elements = $mydict["5"]; 。您的方法签名如下所示:

Task

现在,您实际实现该方法的方式取决于API public Task<string> SendAndRecieveMessage(string MessageToSend) 公开的内容。 VpnObject对这类事情非常有用。

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

VpnObject

如果public Task<string> SendAndReceiveMessage(string messageToSend) { var tcs = new TaskCompletionSource<string>(); ... VpnObject.OnMessageReceived += (s, e) => tcs.SetResult(e.Message); ... return tcs.Task; } 可以接受在请求完成时将调用的回调:

VpnObject

如果public Task<string> SendAndReceiveMessage(string messageToSend) { var tcs = new TaskCompletionSource<string>(); ... VpnObject.OnMessageReceived(message => tcs.SetResult(message)); ... return tcs.Task; } 不支持此任何一项,您可以回退到投票:

VpnObject

答案 1 :(得分:0)

  

您知道使用变量并为其分配值并检查时间很简单,但它会大大降低性能。

旋转while循环绝对不是实现它的方法。即使有睡眠,它也很笨重,C#有多种方法可以解决这个问题。

目前还不完全清楚你的VPN发送和接收方法是如何工作的,但解决这个问题的想法是使用回调方法,或者如你所说,使用C#异步框架。

如果没有关于VPN对象的更多细节,我只需要有一些存根方法。我们的想法是创建一个返回字符串的Task,将其标记为异步任务,然后PATH来完成。在您的情况下,任务正在接收VPN响应字符串。

像这样。

await