【问题标题】:C# synchronization between async tasks with infinite while loop?带有无限while循环的异步任务之间的C#同步?
【发布时间】:2016-12-17 10:31:56
【问题描述】:

我有一个运行无限循环的异步任务进行实时处理:

private async void RealTimeProcessingAsync()
{
    while (true)
    {
        //....
       Tmstaus  status = await ReadStatusAsync();
       switch (status)
       {
            case Ack:
            //...
            break;
            //...
        }
        //...
    }
}

我创建了另一个异步方法 SendWriteRqst,该方法将命令发布到 RealTimeProcessingAsync(),应该等待状态设置为定义的条件并返回。

public async Task<WriteState> SendWriteRqstAsync(TmCommand tmCmd)
{
    //...
    await SomeCondition()//based on status value
    //...
    return wrState;
}

如果 SomeCondition() 运行另一个 while 循环来轮询状态并在条件设置时返回 true,它将起作用,但我正在寻找更好的解决方案。

(抱歉英语不好)

【问题讨论】:

  • SomeCondition() 在做什么,从哪里/什么轮询状态?
  • 实际上是一个任务,它从 RealTimeProcessingAsync() 中轮询一些变量的条件,比如状态变量。
  • 所以SomeCondition() 将调用RealTimeProcessingAsync(),但只有在满足某些条件时才会返回,这些条件取决于RealTimeProcessingAsync() 所做的状态更改。这就是为什么您必须多次致电RealTimeProcessingAsync()。是这样吗?
  • 否,RealTimeProcessingAsync() 在与硬件板建立连接时启动,我想根据 RealTimeProcessingAsync() 中的条件实现 SendWriteRqstAsync 异步,这就是我实现 SomeCondition() 的原因
  • 所以...RealTimeProcessingAsync() 是在某个时间点启动并永远运行?然后,您希望 SendWriteRqstAsync 仅在 RealTimeProcessingAsync() 中满足某些条件时返回。我做对了吗?否则,你能发布一下SomeCondition()在做什么吗?

标签: c# asynchronous task-parallel-library task


【解决方案1】:

如果 SomeCondition() 运行另一个 while 循环来轮询状态并在条件设置时返回 true ,它将起作用,但我正在寻找更好的解决方案。

你想要的是一个信号而不是一个轮询循环。如果只需要设置一次信号,可以使用TaskCompletionSource&lt;T&gt;。如果你想要一个可以设置和重置的信号(无需重构),那么你可以使用AsyncManualResetEvent(也可以使用available from NuGet in my AsyncEx.Coordination library)。

【讨论】:

  • "AsyncManualResetEvent" 是我需要的,感谢您的回答和库,它对我非常有用。
猜你喜欢
  • 2023-03-16
  • 2017-09-30
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2018-07-29
相关资源
最近更新 更多