Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net核心控制器中,为什么ExecutionContext.SuppressFlow()抛出;AsyncFlowControl对象必须在创建它的线程上使用;_C#_Asp.net Core_Threadcontext - Fatal编程技术网

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
这个词作为其名称的一部分,并且没有处理这种事情,它听起来更像是基于线程的,而不是异步的(这是两个不同的东西)。对我来说似乎是合理的。一旦在另一个线程上恢复,就太晚了,无法抑制执行上下文流。