C# 设置ConfigureWait和SynchronizationContext的行为

C# 设置ConfigureWait和SynchronizationContext的行为,c#,async-await,synchronizationcontext,C#,Async Await,Synchronizationcontext,在他的解释中,当调用ConfigureAwait(false)时,方法的其余部分将在线程池线程上执行,除非您正在等待的任务已经完成。 清楚的是:如果我使用ConfigureAwait(false)异步调用后执行的所有操作都将在线程池线程上执行,因此不会在UI同步上下文中运行,否则(特别需要基于UI的操作,如textBox1.Text=data.Property)它在UI SynchronizationContext中运行 我不明白的是:await是否意味着我等待的任务总是在方法开始之前完成?那么

在他的解释中,当调用
ConfigureAwait(false)
时,方法的其余部分将在线程池线程上执行,除非您正在等待的
任务
已经完成。

清楚的是:如果我使用
ConfigureAwait(false)
异步调用后执行的所有操作都将在线程池线程上执行,因此不会在UI同步上下文中运行,否则(特别需要基于UI的操作,如
textBox1.Text=data.Property
)它在UI SynchronizationContext中运行


我不明白的是:
await
是否意味着我等待的
任务总是在方法开始之前完成?那么,如何才能在继续之前完成任务

想象一下这样的事情

var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
我认为很容易看出任务甚至可以在
wait task
调用之前完成


在这种情况下,等待后的代码将在相同的上下文中执行,即使您使用了
.ConfigureAwait(false)

想象一下这样的情况

var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
我认为很容易看出任务甚至可以在
wait task
调用之前完成


在这种情况下,等待后的代码将在相同的上下文中执行,即使您使用了
.ConfigureAwait(false)

想象一下这样的情况

var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
我认为很容易看出任务甚至可以在
wait task
调用之前完成


在这种情况下,等待后的代码将在相同的上下文中执行,即使您使用了
.ConfigureAwait(false)

想象一下这样的情况

var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
我认为很容易看出任务甚至可以在
wait task
调用之前完成


在这种情况下,等待后的代码将在相同的上下文中执行,即使您使用了
.ConfigureAwait(false)

了解等待顺序也很重要。特别是,点运算符(
)的优先级高于
等待
。因此,当您这样做时:

await SomeMethodAsync().ConfigureAwait(false);
这与:

var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;

因此,
ConfigureAwait
是在
await
表达式之前进行计算的,该表达式实际上执行(异步)等待。

了解前后顺序很重要。特别是,点运算符(
)的优先级高于
等待
。因此,当您这样做时:

await SomeMethodAsync().ConfigureAwait(false);
这与:

var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;

因此,
ConfigureAwait
是在
await
表达式之前进行计算的,该表达式实际上执行(异步)等待。

了解前后顺序很重要。特别是,点运算符(
)的优先级高于
等待
。因此,当您这样做时:

await SomeMethodAsync().ConfigureAwait(false);
这与:

var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;

因此,
ConfigureAwait
是在
await
表达式之前进行计算的,该表达式实际上执行(异步)等待。

了解前后顺序很重要。特别是,点运算符(
)的优先级高于
等待
。因此,当您这样做时:

await SomeMethodAsync().ConfigureAwait(false);
这与:

var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;

因此,
ConfigureAwait
是在
await
表达式之前计算的,它实际上执行(异步)等待。

谢谢你,德克!好吧,好吧,我明白了!总是只在
var result=await DoSomething().ConfigureAwait(false)之类的事情上想象。但这是否意味着如果调用类似于我的示例的东西,我的任务总是在执行方法的其余部分之前完成,因此应该在UI SynchronizationContext中执行?是的,但您不应该依赖于此。如果您想在调用异步方法的同一上下文中使用
await
后执行代码,那么不要使用
.ConfigureAwait
。我认为这样编写代码会更有意义:
var task=obj.sometaskaync();/*进行一些冗长的计算*/var value=wait task.configurewait(false)ConfigureAwait()
只有与
await
一起使用才有意义。谢谢你,德克!好吧,好吧,我明白了!总是只在
var result=await DoSomething().ConfigureAwait(false)之类的事情上想象。但这是否意味着如果调用类似于我的示例的东西,我的任务总是在执行方法的其余部分之前完成,因此应该在UI SynchronizationContext中执行?是的,但您不应该依赖于此。如果您想在调用异步方法的同一上下文中使用
await
后执行代码,那么不要使用
.ConfigureAwait
。我认为这样编写代码会更有意义:
var task=obj.sometaskaync();/*进行一些冗长的计算*/var value=wait task.configurewait(false)ConfigureAwait()
只有与
await
一起使用才有意义。谢谢你,德克!好吧,好吧,我明白了!总是只在
var result=await DoSomething().ConfigureAwait(false)之类的事情上想象。但这是否意味着如果调用类似于我的示例的东西,我的任务总是在执行方法的其余部分之前完成,因此应该在UI SynchronizationContext中执行?是的,但您不应该依赖于此。如果您想在调用异步方法的同一上下文中使用
await
后执行代码,那么不要使用
.ConfigureAwait
。我认为这样编写代码会更有意义:
var task=obj.sometaskaync();/*进行一些冗长的计算*/var value=wait task.configurewait(false)ConfigureAwait()
只有与
await
一起使用才有意义。谢谢你,德克!好吧,好吧,我明白了!总是只在
var result=await DoSomething().ConfigureAwait(false)之类的事情上想象。但这不是吗