当你有服务器端代码(即一些ApiController)并且你的函数是异步的 - 所以它们返回Task<SomeObject>- 你认为最好的做法是等待你调用的函数ConfigureAwait(false)吗?
我已经读过它更高效,因为它不必将线程上下文切换回原始线程上下文.但是,使用ASP.NET Web Api,如果您的请求是在一个线程上进行的,并且等待某些函数和调用ConfigureAwait(false),则可能会在返回ApiController函数的最终结果时将您置于不同的线程上.
我在下面输入了一个我正在谈论的例子:
public class CustomerController : ApiController
{
public async Task<Customer> Get(int id)
{
// you are on a particular thread here
var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false);
// now you are on a different thread! will that cause problems?
return customer;
}
}
Run Code Online (Sandbox Code Playgroud) 在Programming C#一书中,它有一些示例代码SynchronizationContext:
SynchronizationContext originalContext = SynchronizationContext.Current;
ThreadPool.QueueUserWorkItem(delegate {
string text = File.ReadAllText(@"c:\temp\log.txt");
originalContext.Post(delegate {
myTextBox.Text = text;
}, null);
});
Run Code Online (Sandbox Code Playgroud)
我是线程的初学者,所以请详细回答.首先,我不知道上下文是什么意思,程序保存在originalContext什么?当Post方法被触发时,UI线程会做什么?
如果我问一些愚蠢的事情,请纠正我,谢谢!
编辑:例如,如果我只是写myTextBox.Text = text;在方法中,有什么区别?
我正在尝试更多地了解它SynchronizationContext,所以我制作了这个简单的控制台应用程序:
private static void Main()
{
var sc = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(sc);
DoSomething().Wait();
}
private static async Task DoSomething()
{
Console.WriteLine(SynchronizationContext.Current != null); // true
await Task.Delay(3000);
Console.WriteLine(SynchronizationContext.Current != null); // false! why ?
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,await操作员会捕获当前的信息SynchronizationContext然后将其余的异步方法发布到它.
但是,在我的应用程序中,之后SynchronizationContext.Current为null await.这是为什么 ?
编辑:
即使我自己使用SynchronizationContext它也不会被捕获,尽管它的Post功能被调用.这是我的SC:
public class MySC : SynchronizationContext
{
public override void Post(SendOrPostCallback d, object state)
{
base.Post(d, state);
Console.WriteLine("Posted");
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我使用它的方式:
var sc = new MySC();
SynchronizationContext.SetSynchronizationContext(sc); …Run Code Online (Sandbox Code Playgroud)