我正在试图理解在async foreach
循环中设置ConfigureAwait(false)
的影响?
await foreach (var item in data.ConfigureAwait(false))
{
//...
}
我们到底在哪里丢失了同步上下文?我什么时候想要在上面的foreach
外观内设置ConfigureAwait(false)
?
我理解在异步数据源中这样做的意义,但是foreach
循环又如何呢?
我希望循环中的上下文不会有同步上下文,但我的实验表明上下文仍然存在.
以下是我的示例Winform应用程序:
private async void button1_Click(object sender, EventArgs e)
{
var dataSource = new DataFactory();
IAsyncEnumerable<int> data = dataSource.GetData();
await foreach (var item in data.ConfigureAwait(false))
{
Console.WriteLine(item);
DataFactory.PrintContext("Data - item: " + item);
}
}
public class DataFactory
{
public async IAsyncEnumerable<int> GetData()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(250).ConfigureAwait(true);
PrintContext("Generating Data: " + i);
yield return i;
}
}
public static void PrintContext(string message)
{
Debug.WriteLine($"{message}, TID={Environment.CurrentManagedThreadId}, SyncContext.Current={(SynchronizationContext.Current?.GetType().Name?.ToString() ?? "null")}");
}
}
运行代码时的样例输出:
Generating Data: 0, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Data - item: 0, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Generating Data: 1, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Data - item: 1, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Generating Data: 2, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Data - item: 2, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Generating Data: 3, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext
Data - item: 3, TID=1, SyncContext.Current=WindowsFormsSynchronizationContext