15

イベントでデータを渡す必要があります。現在、(comportを介して)より多くのデータを受信すると、イベントは発生しますが、前のイベント(&data)はまだ処理されていないため、データは上書きされます。
イベントとデータを安全に処理するにはどうすればよいですか?このような複数のイベント(15x)があるので、データにキューを使用するのが最善の方法なのか、イベントと一緒にデータを渡すのか(SOアイテム4215845など)はわかりません。

例(この例は文字列を使用していますが、配列、boolなども使用しています):

「送信者」側(class1):

public event EventHandler evDiaStringMessage = delegate { };
private void evDiaStringMessageEvent()
{
    evDiaStringMessage(this, new EventArgs());
}
private static string _DiaString;
public string DiaString
{
    get { return _DiaString; }
    set { _DiaString = value; }
}

DiaStringにはデータが含まれており、evDiaStringMessageの起動が早すぎると上書きされます。

'レシーバー/GUI'側(クラス2):

dia.evDiaStringMessage += new EventHandler(dia_evDiaStringMessage);

private delegate void dia_evDiaStringMessageCallBack(object sender, EventArgs e);
void dia_evDiaStringMessage(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e});
    }
    else
    {
        frmcomm.CommTextBox("Receiver message: " + dia.DiaString + "\r\n", Color.Red);
    }
}

dia.DiaStringには期待されるデータ(以前のデータ)は含まれていませんが、すべてのイベントが「受信」されています。

あなたの助けは大歓迎です!例を挙げればさらに!

編集:

コードを次のように変更しました。

「送信者」側(class1):

public event EventHandler<DiaStringEventArgs> evDiaStringMessage ;
public class DiaStringEventArgs : EventArgs
{
    public string DiaString  { get; set; }
}

private void evDiaStringMessageEvent(DiaStringEventArgs e)
{
    EventHandler<DiaStringEventArgs> handler = evDiaStringMessage;
    if (handler != null)
        handler(this, e);
}

..。

private void PrepareDataAndFireEvent()
{
    DiaStringEventArgs args = new DiaStringEventArgs(); 
    args.DiaString = ByteToString(data);
    evDiaStringMessageEvent(args);
}

'レシーバー/GUI'側(クラス2):

dia.evDiaStringMessage += new EventHandler<ifDiA10.DiaStringEventArgs>(dia_evDiaStringMessage);

private delegate void dia_evDiaStringMessageCallBack(object sender, ifDiA10.DiaStringEventArgs e);
void dia_evDiaStringMessage(object sender, ifDiA10.DiaStringEventArgs e)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e});
    }
    else
    {
        frmcomm.CommTextBox("Receiver message: " + e.DiaString + "\r\n", Color.Red);
    }
}
4

2 に答える 2

20

データをカスタムEventArgsクラスに保存できます。

public class ReceivedDataEventArgs : EventArgs
{
   // Add the properties you require
}

イベントは次のように定義されます。

public event EventHandler<ReceivedDataEventArgs> ReceivedData;

ハンドラーはEventArgsオブジェクトではなくクラスをインスタンスに取り込むため、正しいデータが得られます。

于 2012-11-19T13:46:20.127 に答える
2

dia.DiaStringイベントが処理されたときにそれを読み戻すのではなく、イベントが発生したときの値を渡す必要があります。

これを行うには、クラスを拡張してEventArgsカスタムプロパティを作成します。

例が必要な場合はお知らせください。

于 2012-11-19T13:46:15.860 に答える