相关疑难解决方法(0)

为所有服务器端代码调用ConfigureAwait的最佳实践

当你有服务器端代码(即一些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)

c# task-parallel-library async-await asp.net-web-api

517
推荐指数
4
解决办法
18万
查看次数

SynchronizationContext有什么作用?

在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;在方法中,有什么区别?

.net c# multithreading

116
推荐指数
6
解决办法
4万
查看次数

为什么在Console App中没有捕获默认的SynchronizationContext?

我正在尝试更多地了解它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)

c# console-application synchronizationcontext async-await

6
推荐指数
1
解决办法
515
查看次数