作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道在 ASP.NET 中,当 I/O 在后台发生时使用 await 时,工作线程会返回到池中,这对于可伸缩性来说非常好。
我的 Windows 服务是一个套接字服务器,它使用 Begin/End 风格的异步套接字 I/O。混合我的魔法,我知道。我在 EndRead 回调中,收到工作请求。我不希望使回调发生阻塞的线程。
我正在使用 Nito.AsyncEx 库,使用 AsyncContext.Run(() => DoMyBiddingHopefullyInTheBackground(...))...
private void EndRead(IAsyncResult result)
{
int nRead = m_socketStream.EndRead(result);
...
AsyncContext.Run(() => DoMyBiddingHopefullyInTheBackground(...))
}
private async Task DoMyBiddingHopefullyInTheBackground(...)
{
await DoSomeAsyncIoWork();
}
使用 AsyncContext 是我能找到的让非异步标记代码调用使用 await 的异步标记代码的唯一方法。
AsyncContext.Run 会阻塞调用我的套接字结束回调例程的线程吗?如果是这样,是否有任何方法可以使该线程在异步/等待 I/O 期间返回到线程池?
最佳答案
如果你想运行一个async
方法并且你不想等待它完成,试试这个:
Task.Run(() => DoMyBiddingInTheBackground());
关于c# - 调用 C# 的 await 的 .NET Windows 服务中的 I/O 回调是否可能不阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338300/
我是一名优秀的程序员,十分优秀!