c# - ConfigureAwait(true) 没有返回等待它的上下文

标签 c# multithreading asynchronous async-await

示例:

 static void Main(string[] args)
 {
     int counter = 0;
     var t = new System.Timers.Timer();
     t.Interval = 3000;
     t.Elapsed += async (sender, e) =>  
     {
        Debug.WriteLine("Before await - Thread : {0} , Counter : {1}", Thread.CurrentThread.ManagedThreadId, counter);
        await Task.Delay(1000).ConfigureAwait(true);
        Debug.WriteLine("Ater await Thread : {0}, Counter : {1} ", Thread.CurrentThread.ManagedThreadId, counter);

         counter++;
         if (counter == 2)
         {
            Debug.WriteLine("Stop");
            t.Stop();
         }
     };

     t.Start();

     Console.ReadKey();
 }   

这总是输出:

 Before await - Thread : 4 , Counter : 0 
 Ater await Thread : 4, Counter : 0  
 Before await - Thread : 5 , Counter : 1 
 Ater await Thread : 4, Counter : 1  

 Stop 

为什么它没有在调用 await 的线程上返回。它第一次执行,但随后计时器在线程 5 上运行,并且假定捕获异步操作结束时的上下文,正如您所看到的,它在线程 4 上返回。

最佳答案

控制台应用程序中没有任何同步上下文。

如果您在 WinForms 中运行您的代码,您会发现它会按预期工作..

关于c# - ConfigureAwait(true) 没有返回等待它的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32038087/

相关文章:

c# - .NET4.0 : Thread-Safe Updating of ConcurrentDictionary<TKey, T值>

c++ - Objective-C block 、C++ 变量和异步代码

javascript - 在循环内使用条件

c# - 如何使用 TreeView 更改显示?

c# - 如何复制 Azure 表

java - 为什么这段代码的结果是不确定的?

java - 当多个线程想要访问 ReentrantReadWriteLock 时会发生什么?

c# - 如何用数组搜索数组?

c# - 字符串中断反序列化中的空数组

python - Tornado .httpclient.HTTPError : HTTP 599: Timeout during request