2

简单来说,我想做的是通过在单独的线程上启动一个进程来做我需要做的事情并等待一个事件被提出来说“我已经完成了我需要做的事情”来处理“做某事”做”。尽管如此,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或在事件范围之外设置一个标志来检查,但我觉得这很脏。

有什么建议么?

TPL由于我使用的是 .NET 3.5,因此在我的情况下不适用。

4

2 回答 2

0

由于这部分代码似乎已经在后台线程中运行,而您只是启动一个新线程以便等待它完成,因此最好Send直接调用,而不是异步的。

  • 完成后,您无需触发事件。

  • 当它需要继续时,您不需要向主线程发出信号。

  • 您不需要在 a 中记录异常List,您可以将它们抛出并SendMessage使用 try/catch 块捕获它们。

于 2012-11-16T15:21:58.077 回答
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 回答