0

我试图抑制跨异步线程的执行上下文的流动。我写了下面的代码,但它抛出了一个错误 -

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!");
}

我是不是走错了路?

4

1 回答 1

3

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

只需要问:为什么?

我写了下面的代码,但它会引发错误

当您在暂停它的不同线程上恢复执行上下文流时,会发生此错误。

要修复此错误,请不要awaitusing块内使用:

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

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

于 2019-01-24T03:15:06.017 回答