В основном контроллере asp.net почему ExecutionContext.SuppressFlow () выбрасывает «объект AsyncFlowControl должен использоваться в потоке, в котором он был создан». - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь подавить поток контекста выполнения через асинхронные потоки. Я написал код ниже, но он выдает ошибку -

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 голосов
/ 24 января 2019

Я пытаюсь подавить поток контекста выполнения через асинхронные потоки.

Просто нужно спросить: почему?

Я написал код ниже, но он выдает ошибку

Эта ошибка возникает при восстановлении потока контекста выполнения в другом потоке, в котором вы его приостановили.

Чтобы исправить эту ошибку, просто не используйте await в блоке using:

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

Сохраняя код в using синхронно, вы гарантируете, что остаетесь в том же потоке.

...