我试图抑制跨异步线程的执行上下文流。我已经写了下面的代码,但是会引发错误-
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!");
}
我做错了吗?
答案 0 :(得分:1)
我试图抑制跨异步线程的执行上下文流。
只需要问:为什么?
我已经写了下面的代码,但是会引发错误
当您在挂起它的另一个线程上恢复执行上下文流时,会发生此错误。
要解决此错误,只需不要在await
块内使用using
:
Task task;
using (ExecutionContext.SuppressFlow())
task = Switch.Instance.SwitchOn();
await task;
通过使using
中的代码保持同步,可以确保您停留在同一线程上。