鸟语天空
Task.ConfigureAwait()
post by:追风剑情 2024-1-22 14:23

[官方文档] Task.ConfigureAwait 方法

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

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

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("main1 thread:" + Thread.CurrentThread.ManagedThreadId);
            Task task = TestConfigureAwait();
            //等待task执行完成
            task.Wait();
            Console.WriteLine("main2 thread:" + Thread.CurrentThread.ManagedThreadId);
        }

        public async Task TestConfigureAwait()
        {
            await Task.Run(() => {
                Thread.Sleep(1000);
                Console.WriteLine("Task thread :" + Thread.CurrentThread.ManagedThreadId);
            }).ConfigureAwait(true);
            //因为上面的任务设置了ConfigureAwait(true),
            //所以接下来的代码希望通过UI线程来运行,而UI线程调用了Wait(),造成相交等待,产生死锁。
            //注意:ConfigureAwait(true) 在控制台程序中不起作用。
            Console.WriteLine("TestConfigureAwait thread : " +
                       Thread.CurrentThread.ManagedThreadId);
        }
    }
}

222222.png

1111111.png

与Awaiter结合使用

ConfiguredTaskAwaitable<int>.ConfiguredTaskAwaiter awaiter = task.ConfigureAwait(true).GetAwaiter();
awaiter.OnCompleted(() =>
{
	Console.WriteLine("OnCompleted 线程ID={0}", Thread.CurrentThread.ManagedThreadId);
	Console.WriteLine("前驱任务完成时,我就会继续执行");
});
评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容