私のアプリケーションは、TCP/IPプロトコルとCOMポートを介して多くの外部デバイスに接続されています。メインロジックは、外部デバイスからの信号をリッスンしてコマンドを送信する(有限状態マシンとして実装された)MainController
クラスにあります。同期メソッドを非同期で実行し、結果を待つ方法
MainController
が外部信号を受信するたびに、GUIにイベント、たとえばOnSensor1Received
、OnSensor2Received
などが通知されます。アイコンやメッセージなどを表示できます。他の方向にも同じロジックが適用されます。MainController
が外部デバイスに信号を送信すると、イベントが発生し、GUIに何かが表示されます。
ここまでのところ、すべての通信は非同期です(これが正しい用語であれば)。つまり、イベントを受け取って処理し、コマンドを実行しますが、同じ操作でリターンを待つことはありません(コマンドを送信するすべてのメソッドが無効であると言うこともできます)。
しかし、今では1つのパブリックメソッドint Process(string input, out string output)
を持つ新しいデバイスを追加する必要があります。メソッドの実行には数秒かかりますが、その間に他のすべてのコードが待機しています。たとえば、このメソッドの実行中に別の外部デバイスから信号が取得された場合、GUIはブロック後にのみリフレッシュされますメソッドWrite
が実行されます。 Write
メソッドを非同期に実行させると、GUIは他のすべての信号をリアルタイムで表示しますか?私は新しいデバイスを使用しようとすると
のコード例では、これはどこかMainController
で呼ばれている:
// Notify GUI that the blocking plugin was activated.
OnBlockingPluginActive(this, EventArgs.Empty);
string result;
// Here is the problem - during the execution of this method the GUI is not responding for other signals.
var status = blockingPlugin.Process(input, out result);
if (status == 0)
{
// OK, notify GUI and fire a BlockingPluginOK command in finite state machine.
OnBlockingPluginOK(this, EventArgs.Empty);
}
else
{
// Error, notify GUI and fire a BlockingPluginError command in finite state machine.
OnBlockingPluginError(this, EventArgs.Empty);
}
また、私は、そう何のネイティブサポートを.NET 4.0を使用していないしていますし、4.5にアップグレードすることはできませんのでご注意くださいasync/awaitの場合。
あなたのバンは、これを試してください:[ https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.16](https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.16) – Fabio
まだ.NET 4.0を使用して、Task.Factory.StartNewを使用して、.ContinueWith –
"秒数秒"を使用するのは合理的な動作ではありません。呼び出しをワーカースレッドに移動することはできますが、呼び出しをブロックしてブロックします。そのライブラリは大幅にボルケンであるか、環境問題のために正しく動作していません。あなたは、問題を回避しようとすることによってそれをより良くするつもりはない、アドバイスのために図書館の著者にpingをする。 –