0

.NET 4.0 では、応答を待ってから応答を返す機会はありますか?

現在、私はこのようにやっていますが、あまり良くなく、好きではありません:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        byte[] options = new byte[]{1,1,0};
        COMManager mgr = new COMManager("COM1");

        byte[] result = mgr.GetResponse(options);
    }
}

そして私のCOMマネージャークラス(別のクラス(dll)で操作を行う必要があります):

public class COMManager
    {
        SerialPort sp = null;
        byte[] result = null;
        bool completed = false;

        public COMManager(string comport)
        {
            sp = new SerialPort(comport);
            sp.DataReceived +=new SerialDataReceivedEventHandler(sp_DataReceived);
        }

        public byte[] GetResponse(byte[] option)
        {
            sp.Write(option, 0, option.Length);
            //I don't like the way...
            while (!completed) { }
            completed = false;
            return result;
        }

        void  sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            result = new byte[sp.BytesToRead];
            sp.Read(result, 0, sp.BytesToRead);
            completed = true;
        }
    }

.NET 4.5 では、"await" ステートメントを使用する機会があるかもしれません。しかし、現在のプロジェクトでは、.NET 4.0 しか使用できません。何か案は?

4

3 に答える 3

3

非同期で読み取りたくない場合は、DataReceived イベントを使用しても意味がありません。GetResponse() で直接 Read() メソッドを呼び出すだけです。

完全な応答が得られると想定できないことに注意してください。Read() の戻り値を無視することはできません。通常、数バイトしか返されません。シリアル ポートはかなり遅いです。そのため、応答全体を取得するまで、必ず Read() を呼び出し続けてください。

于 2012-08-02T16:54:35.857 に答える
2

クリーンな方法はAutoResetEvent、受信コールバックがそれを通知するのを待つことです。

このメソッドでラッパーを作成することによりawait、.Netのすべてのバージョンで効果的に実行できます。

于 2012-08-02T16:46:16.277 に答える
2

元の質問については、実行中のスレッドをブロックするために、応答が取得されたときに取得されるManualResetEventまたはAutoResetEventを使用できます。Setページにかなり良い説明があります。

スレッド化に関しては、経験則として、何をしているのかが非常に明確でない場合は、それを実行しないでください。

イベントにアクセスできるときに同期ブロッキングを行うのは無駄に思えます。データがストリームであることを考えると、これは抽象化を維持するのが難しくなる可能性があります。

上記のアイデアについてのより長い説明が、こちらの例で説明されています。

と非同期でこれを行うこともできますTaskCompletionSource。set の代わりに を呼び出しSetResult、 を待つことができます.Taskが、考え方はほとんど同じです。

于 2012-08-02T16:47:52.467 に答える