2

簡単に言うと、私がやろうとしているのは、別のスレッドでプロセスを起動して必要なことを実行し、イベントが発生して「必要なことを完了した」と言うのを待つことで、「DoingSomething」を処理することです。行う"。ただしEventArgs、プロセス中に発生する可能性のあるエラーに対するプロパティがあります。これが私の状況の簡単な例です。

public class MessageHandler
{
  private AutoResetEvent MessageHasSent = new AutoResetEvent(false);
  public void SendMessage()
  {
    MessageSender ms = new MessageSender();
    ms.MessageSent += new EventHandler<MessageSentEventArgs>(MessageHandler_MessageSent);

    Thread t = new Thread(ms.Send());
    t.Start();

    MessageHasSent.WaitOne();
    //Do some check here

    //Same again but for "Message recieved"
  }
  void MessageHandler_MessageSent(object sender, MessageSentEventArgs e)
  {
    if (e.Errors.Count != 0)
    {
      //What can I do here to return to the next step after waitone?
    }
    else
      MessageHasSent.Set();
  }
}
public class MessageSender
{
  public event EventHandler<MessageSentEventArgs> MessageSent;
  public void Send()
  {
    //Do some method which could potentiallialy return a List<Error>
    MessageSent(this, new MessageSentEventArgs() { Errors = new List<Error>() });
  }
}
public class Error { }
public class MessageSentEventArgs : EventArgs
{
  public List<Error> Errors;
}

基本的に、イベントが発生するSendとコードから続行されますが、イベントの何らかの方法でフィードバックを提供し、場合によってはを使用する必要がありMessageHasSentます。私はさまざまな方法を試しましたが、Close代わりに呼び出すとSet、おそらく。などの何かにアクセスできるようになると思いましIsClosedた。イベントの範囲外のフラグを設定して確認することもできますがthrow an exception、これは汚れているように感じます。

助言がありますか?

.NET 3.5を使用してTPLいるため、私の場合は使用できません。

4

2 に答える 2

0

これはあなたが望むことをします:

public class MessageHandler
{
    private AutoResetEvent MessageHasSent = new AutoResetEvent(false);
    private bool IsSuccess = false;
    public void SendMessage()
    {
        MessageSender ms = new MessageSender();
        ms.MessageSent += new EventHandler<MessageSentEventArgs>(MessageHandler_MessageSent);

        Thread t = new Thread(ms.Send());
        t.Start();

        MessageHasSent.WaitOne();
        if(IsSuccess)
            //wohooo
        else
            //oh crap

        //Same again but for "Message recieved"
    }
    void MessageHandler_MessageSent(object sender, MessageSentEventArgs e)
    {
        IsSuccess = e.Errors.Count == 0;
        MessageHasSent.Set();
    }
}
public class MessageSender
{
    public event EventHandler<MessageSentEventArgs> MessageSent;
    public void Send()
    {
        //Do some method which could potentiallialy return a List<Error>
        MessageSent(this, new MessageSentEventArgs() { Errors = new List<Error>() });
    }
}
public class Error { }
public class MessageSentEventArgs : EventArgs
{
    public List<Error> Errors;
}
于 2012-11-16T15:10:31.873 に答える
0

コードのこのセクション全体がすでにバックグラウンドスレッドで実行されているようであり、終了するのを待つためだけに新しいスレッドを起動するだけなので、Send直接呼び出す方がよいでしょう。 、非同期ではなく。

  • 完了時にイベントを開始する必要はありません。

  • 続行する必要があるときにメインスレッドに信号を送る必要はありません。

  • 例外をログに記録する必要はありません。例外をListスローしSendMessageて、try/catchブロックでキャッチすることができます。

于 2012-11-16T15:21:58.077 に答える