Task.ConfigureAwait()

作者:追风剑情 发布于:2024-1-22 14:23 分类:C#

[官方文档] Task.ConfigureAwait 方法

尝试将延续任务封送回原始上下文,则为 true;否则为 false。延续任务指异步(async)方法中await语句之后的代码。

注意: ConfigureAwait(true) 仅在UI程序中有效。

  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using System.Windows.Forms;
  5.  
  6. namespace WindowsFormsApp4
  7. {
  8. public partial class Form1 : Form
  9. {
  10. public Form1()
  11. {
  12. InitializeComponent();
  13. }
  14.  
  15. private void button1_Click(object sender, EventArgs e)
  16. {
  17. Console.WriteLine("main1 thread:" + Thread.CurrentThread.ManagedThreadId);
  18. Task task = TestConfigureAwait();
  19. //等待task执行完成
  20. task.Wait();
  21. Console.WriteLine("main2 thread:" + Thread.CurrentThread.ManagedThreadId);
  22. }
  23.  
  24. public async Task TestConfigureAwait()
  25. {
  26. await Task.Run(() => {
  27. Thread.Sleep(1000);
  28. Console.WriteLine("Task thread :" + Thread.CurrentThread.ManagedThreadId);
  29. }).ConfigureAwait(true);
  30. //因为上面的任务设置了ConfigureAwait(true),
  31. //所以接下来的代码希望通过UI线程来运行,而UI线程调用了Wait(),造成相交等待,产生死锁。
  32. //注意:ConfigureAwait(true) 在控制台程序中不起作用。
  33. Console.WriteLine("TestConfigureAwait thread : " +
  34. Thread.CurrentThread.ManagedThreadId);
  35. }
  36. }
  37. }

222222.png

1111111.png

与Awaiter结合使用

  1. ConfiguredTaskAwaitable<int>.ConfiguredTaskAwaiter awaiter = task.ConfigureAwait(true).GetAwaiter();
  2. awaiter.OnCompleted(() =>
  3. {
  4. Console.WriteLine("OnCompleted 线程ID={0}", Thread.CurrentThread.ManagedThreadId);
  5. Console.WriteLine("前驱任务完成时,我就会继续执行");
  6. });

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号