我有一个静态类,并且在该类中是一个异步任务,该任务连续运行以串行端口处理设置命令。如果我向程序员公开一个包含方法和属性的公共类,那么在异步任务中按需执行的最佳方法是什么?我如何在异步任务中触发某些内容来接受并运行各种命令?有没有一种模式或明显的方法可以做到这一点?
之所以这样做,是因为我想从与Task相同的线程中运行所有命令。有些命令是预先确定并内置在任务中的,其他命令则是来自外部环境(例如脚本或com对象)的命令,但是它们都进入同一个串行端口,因此需要以安全的方式进行处理。
任何帮助表示赞赏。 谢谢
答案 0 :(得分:1)
生产者-消费者示例
public partial class Form1 : Form
{
private CancellationTokenSource _cts;
public Form1()
{
InitializeComponent();
}
private void Producer()
{
var id = 0;
while (true )
{
CommandPool.Commands.Add($"Command {++id}");
Thread.Sleep(500);
if (_cts.IsCancellationRequested)
{
CommandPool.Commands.CompleteAdding();
break;
}
}
Debug.WriteLine("Producer finished");
}
private void Start(object sender, EventArgs e)
{
_cts = new CancellationTokenSource();
CommandsComsumer.Run(_cts.Token);
Task.Run(() => Producer(), _cts.Token);
}
private void Stop(object sender, EventArgs e)
{
_cts.Cancel();
}
}
public static class CommandPool
{
public static readonly BlockingCollection<string> Commands = new BlockingCollection<string>();
}
public static class CommandsComsumer
{
private static CancellationToken _token;
public static Task Run(CancellationToken cancellationToken)
{
_token = cancellationToken;
return Task.Factory.StartNew(Consume, cancellationToken);
}
private static void Consume()
{
foreach (var cmd in CommandPool.Commands.GetConsumingEnumerable())
{
Debug.WriteLine(cmd);
}
Debug.WriteLine("Consumer finished");
}
}