c# - 为什么我的异步回调在同一个线程中运行?

标签 c# .net .net-4.0 asynchronous

我正在尝试使用 FtpWebRequest 异步调用(BeginGetResponse/EndGetResponse)。

但是,BeginGetResponse 的回调似乎与我的应用程序在同一个线程中运行,而我的印象是它会使用不同的(和线程池)线程。这意味着我的应用程序在继续之前会在回调中阻塞。

我已经设置了一个 LINQPad 概念验证,如下所示:

"Starting".Dump();
Thread.CurrentThread.GetHashCode().Dump(); 
Thread.CurrentThread.IsThreadPoolThread.Dump();

IAsyncResult result = request.BeginGetResponse((ar) => 
{
     "Inside Callback".Dump();
     Thread.CurrentThread.GetHashCode().Dump();
     Thread.CurrentThread.IsThreadPoolThread.Dump();
     var resp = request.EndGetResponse(ar);
     "Callback Complete".Dump();
}, null);

"After Callback".Dump();

打印输出如下:

Starting
33
False
Inside Callback
33
False
Callback Complete
After Callback

我期望的是这样的(假设回调运行时间足够长):

Starting
33
False
Inside Callback
44
True
After Callback // App continues despite callback running
Callback Complete

如果回调在同一个应用程序线程上运行,这意味着如果回调中的某些内容需要很长时间(例如,为了参数引入 Thread.Sleep),我的应用程序会阻塞在那里。这意味着我无法为请求设置超时(例如使用 ThreadPool.RegisterWaitForSingleObject)。

我是不是漏掉了什么?

最佳答案

当 BeginXXX 方法可以立即完成异步操作时,它不会在线程池线程上运行回调,而是设置 IAsyncResult.CompletedSynchronously Propertytrue 并同步执行回调。

关于c# - 为什么我的异步回调在同一个线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287048/

相关文章:

c# - HttpWebRequest 未返回,连接关闭

c# - 从具有指定长度的特定索引获取数组值

android - 在 .NET MAUI(特别是 Android)中 Hook 键盘事件

c# - ICorProfiler : Why do I get the wrong type token for a jitted function?

.net - 在 Win7 中使用不带注册表的 COM Exe 服务器

c# - 将属性应用于返回值 - 在 F# 中

c# - 用于从不同表中检索的 SQL 语法?

c# - 如何高效地创建和使用 builder 模式

unit-testing - 单元测试。 .NET 4.0 中有哪些新技术/工具?

installation - .NET Framework 4.0 安装程序是否也安装 .NET 3.5?