在asp.net核心控制器中,为什么ExecutionContext.SuppressFlow()抛出“必须在创建对象的线程上使用AsyncFlowControl对象”。

时间:2019-01-23 11:47:00

标签: c# asp.net-core threadcontext

我试图抑制跨异步线程的执行上下文流。我已经写了下面的代码,但是会引发错误-

InvalidOperationException: AsyncFlowControl object must be used on the thread where it was created.
System.Threading.AsyncFlowControl.Undo()
Web1.Controllers.ValuesController+<Get>d__0.MoveNext() in ValuesController.cs
+
                throw;
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

当我通过代码调试时,错误不是 引发。它只会在我不调试时发生。

示例代码:

[HttpGet]
public async Task<IActionResult> Get()
{
    try
    {
        using (ExecutionContext.SuppressFlow())
        {
            await Switch.Instance.SwitchOn();
        }
    }
    catch (Exception ex)
    {
        var x = ex.Message;
        throw;
    }
    return Ok("Done!");
}

我做错了吗?

1 个答案:

答案 0 :(得分:1)

  

我试图抑制跨异步线程的执行上下文流。

只需要问:为什么?

  

我已经写了下面的代码,但是会引发错误

当您在挂起它的另一个线程上恢复执行上下文流时,会发生此错误。

要解决此错误,只需不要在await块内使用using

Task task;
using (ExecutionContext.SuppressFlow())
  task = Switch.Instance.SwitchOn();
await task;

通过使using中的代码保持同步,可以确保您停留在同一线程上。