Task.ConfigureAwait()

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

[官方文档] 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("前驱任务完成时,我就会继续执行");
});

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号