C. *_*son 2 c# async-await easynetq
我想我对async/await对的工作方式有一般性的误解.我正在使用EasyNetQ方法(C#中的RabbitMQ接口),我正在尝试调用我创建的以下方法:
public Task<U> RequestDirectReply<T, U>(T request, int timeout) where T : class where U : class
{
using (var bus = RabbitHutch.CreateBus($"virtualHost=MyVirtualHost;timeout={timeout};host=MyHostName"))
{
return bus.RequestAsync<T, U>(request);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我理解这一点的方式,我应该能够调用这个方法,从RequestAsync获取一个Task,然后做一堆东西,然后等待那个Task,一旦我完成了那些东西.像这样的东西:
Task<Reply> task = RequestDirectReply<Request, Reply>(msg, 10);
for (int i = 0; i < 1000000000; ++i)
{
// Hi, I'm counting to a billion
}
var reply = await task;
Run Code Online (Sandbox Code Playgroud)
但是,程序会阻止对RequestAsync的调用超时,而不是等待.然后await会立即抛出超时异常.
为了看我是否误解,我也尝试了以下方法:
public async Task<U> RequestDirectReply<T, U>(T request, int timeout) where T : class where U : class
{
using (var bus = RabbitHutch.CreateBus($"virtualHost=MyVirtualHost;timeout={timeout};host=MyHostName"))
{
return await bus.RequestAsync<T, U>(request);
}
}
Run Code Online (Sandbox Code Playgroud)
一样.它阻止RequestAsync.这与常规阻塞同步调用有什么不同?
async不保证代码实际上将异步运行或不会阻止调用线程.理想情况下,它应该立即开始操作并按预期返回调用者,但有时(即使在现有的.Net Framework方法中)步骤也不是完全异步.
样品:
async Task<int> MyAsync()
{
Thread.Sleep(1000); // (1) sync wait on calling thread
await Task.Delay(1000); // (2) async wait off calling thread
Thread.Sleep(1000); // (3) sync wait likely on original thread
}
Run Code Online (Sandbox Code Playgroud)
Sleep总是阻止调用线程.首次await调用async方法后返回任务到等待.这是您可能观察到的案例的证明.| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |