C# 在asp.net核心控制器中,为什么ExecutionContext.SuppressFlow()抛出;AsyncFlowControl对象必须在创建它的线程上使用;
我试图抑制异步线程之间的执行上下文流。我已经写了下面的代码,但它抛出了一个错误-C# 在asp.net核心控制器中,为什么ExecutionContext.SuppressFlow()抛出;AsyncFlowControl对象必须在创建它的线程上使用;,c#,asp.net-core,threadcontext,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 Valu
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()
InvalidOperationException:AsyncFlowControl对象必须在创建它的线程上使用。
System.Threading.AsyncFlowControl.Undo()
ValuesController.cs中的Web1.Controllers.ValuesController+d_u0.MoveNext()
+
投掷;
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!");
}
[HttpGet]
公共异步任务Get()
{
尝试
{
使用(ExecutionContext.SuppressFlow())
{
等待Switch.Instance.Switch();
}
}
捕获(例外情况除外)
{
var x=ex.消息;
投掷;
}
返回Ok(“完成!”);
}
我走错方向了吗
我试图抑制异步线程之间的执行上下文流
只是要问:为什么
我已经写了下面的代码,但它抛出了一个错误
在挂起执行上下文流的其他线程上恢复执行上下文流时,会发生此错误
要修复此错误,只需在using
块中不使用wait
:
Task task;
using (ExecutionContext.SuppressFlow())
task = Switch.Instance.SwitchOn();
await task;
通过使用同步将代码保持在中,您可以确保您保持在同一个线程上
我试图抑制异步线程之间的执行上下文流
只是要问:为什么
我已经写了下面的代码,但它抛出了一个错误
在挂起执行上下文流的其他线程上恢复执行上下文流时,会发生此错误
要修复此错误,只需在using
块中不使用wait
:
Task task;
using (ExecutionContext.SuppressFlow())
task = Switch.Instance.SwitchOn();
await task;
通过使用
使中的代码保持同步,可以确保您保持在同一个线程上。当使用
等待设置的继续执行时,它可能位于与您的代码在等待
之前所在的线程不同的线程上。个人意见;不幸的是,它听起来像是一个非常破烂的AsyncFlowControl
设计,考虑到它使用了Async
这个词作为其名称的一部分,并且没有处理这种事情,它听起来更像是基于线程的,而不是异步的(这是两个不同的东西)。对我来说似乎是合理的。一旦您在另一个线程上恢复,就太晚了,无法抑制执行上下文流。当使用wait
设置的继续执行时,它可能位于与您的代码在wait
之前所在的线程不同的线程上。个人意见;不幸的是,它听起来像是一个非常破烂的AsyncFlowControl
设计,考虑到它使用了Async
这个词作为其名称的一部分,并且没有处理这种事情,它听起来更像是基于线程的,而不是异步的(这是两个不同的东西)。对我来说似乎是合理的。一旦在另一个线程上恢复,就太晚了,无法抑制执行上下文流。