私は静的クラスを持っており、そのクラス内には、シリアルポートに対してsetコマンドを継続的に処理する非同期タスクがあります。メソッドとプロパティを含むパブリッククラスをプログラマーに公開する場合、非同期タスク内でそれらをオンデマンドで実行するための最良の方法は何でしょうか?非同期タスクで何かをトリガーして、さまざまなコマンドを受け入れて実行するにはどうすればよいですか?これを行うためのパターンまたは明白な方法はありますか?
タスクと同じスレッドからすべてのコマンドを実行したいので、これを行う理由。一部のコマンドは事前に決定されてタスクに組み込まれていますが、その他のコマンドはスクリプトやcomオブジェクトなどの外部環境からのものですが、すべて同じシリアルポートに送信されるため、安全な方法で処理する必要があります。
助けていただければ幸いです。ありがとう
生産者/消費者の例
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");
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加