首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#阻塞等待响应

C#阻塞等待响应
EN

Stack Overflow用户
提问于 2012-10-17 14:31:46
回答 2查看 7.7K关注 0票数 2

这个问题我遇到过很多次,大部分都是通过hack解决的,但我希望看到一种"proprer“的方式来解决它。

我正在编写一个通信协议,非常类似于RPC,我的端点询问“查询”,它们接收“回复”。

现在..。我想实现一个名为SendCommand的函数,该函数发出一个查询,等待对该问题的答复,然后返回该查询。

所以我可以像这样做

代码语言:javascript
复制
int outside_temp = SendCommand(What is the temperature outside).ToInt();

这样做的问题是消息是异步发送和接收的,事件会通知我新的消息已经到达,以及它是什么。我需要阻塞线程,直到对上述查询的回复到达,提取其数据内容,然后将其返回给调用者。

我的问题是阻塞线程。阻塞线程不是问题,我们讨论的是多线程应用程序,所以UI不会冻结,等等,但问题是实现这一点的正确方法是什么?

我正在考虑在SendCommand函数中初始化一个信号量,等待它,然后释放message received事件处理程序中的信号量(在检查它是正确的消息之后)?

致敬,axos88

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-17 17:55:12

所以你的问题是关于阻塞当前线程并等待答案?我会使用ManualResetEvent来同步调用者和回调。

假设你可以通过一个接受回调方法的对象的send方法来发送你的rpc调用,你可以这样编码你的SendCommand方法:

代码语言:javascript
复制
int SendCommand(int param)
{
    ManualResetEvent mre = new ManualResetEvent(false);

    // this is the result which will be set in the callback
    int result = 0;

    // Send an async command with some data and specify a callback method
    rpc.SendAsync(data, (returnData) =>
                       {
                           // extract / process your return value and 
                           // assign it to an outer scope variable
                           result = returnData.IntValue;
                           // signal the blocked thread to continue
                           mre.Set();
                       });

    // wait for the callback
    mre.WaitOne();
    return result;
}
票数 5
EN

Stack Overflow用户

发布于 2012-10-17 14:35:16

您可以做的是,旋转一个调用SendCommand(..)的新线程。只需等待更远的休眠线程,直到您的SendCommand发送信号。

例如:

代码语言:javascript
复制
volatile bool commandCompleted=false;
Thread sendCommandThread=new Thread(()=>{
   SendCommand(...,()=>{
 commandCompleted=true;
})

 while(!commandCompleted)
{

  Thread.Sleep(100);
}
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12928435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档