小编jef*_*a00的帖子

C#任务ConfigureAwait

以为我正在处理ConfigureAwait,然后我尝试了一个实验.

我的理解是,ConfigureAwait(false)只有存在同步上下文才会有所作为.

ASP,WPF等应该有一个上下文,但控制台应用程序和服务应用程序不应该.

为了了解它是如何工作的,我制作了一个Web API应用程序并包含以下方法:

// GET api/values/5
public async Task<string> Get (int id)
{
    var syncCtx = SynchronizationContext.Current;

    int startThreadId = Thread.CurrentThread.ManagedThreadId;

    await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(true);

    int endThreadId = Thread.CurrentThread.ManagedThreadId;

    return "Start Thread ID: " + startThreadId.ToString() + 
            ": End Thread ID: " + endThreadId.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我的预测是,如果没有ConfigureAwaitConfigureAwait设置为true,我应该在await之前和之后看到相同的线程ID.

我的前几个测试确切地显示了上面的真实设置.

无论如何,代码的后续运行在不同的线程ID上开始和结束ConfigureAwait.

我补充syncCtx说服自己我有一个背景.

我读过的一个警告是,如果任务完成,您将无法保证具有相同的ID.这是这种情况吗?如果是这样,为什么会这样呢?

我是否设置了天真或有缺陷的测试?如果是这样,那么适当的测试是什么?

我在控制台/服务应用程序中开始这条路径,并意识到我没有获得相同的线程ID.我ConfigureAwait(false)在大多数"最佳实践"写作中添加了我所看到的建议.因为我喜欢看事情是如何工作的,所以我尝试测试线程ID.看到它们的不同使我经历了一些导致上述代码的搜索.

c# multithreading asynchronous

6
推荐指数
2
解决办法
2250
查看次数

标签 统计

asynchronous ×1

c# ×1

multithreading ×1