C#中的代表问题,表单和多个解决方案

时间:2010-02-18 22:30:06

标签: c# delegates

编辑:这是一个winform应用程序,很抱歉给您带来不便

免责声明:这是我们在大学时所完成的一项任务,我对这段特殊代码感到困惑。

我在Visual Studio 2008中有两个解决方案,一个用于表单,另一个用于表单可用于功能的DLL。我们的想法是从客户端发送HTML邮件,并使用代理来确认这一点。

DLL的一个类只包含一个委托:

namespace Console.Grand
{
    public delegate void ObserverDelegate(string info);
}

在名为Delegate.cs的文件中

在表单中,我将使用以下方法将其用于Delegate:

private void Update(string info)
{
   this.logBox.Text += Environment.NewLine + info;
}

logBox变量是表单上的TextArea。

在传输时,会发生以下情况(BL代表“业务层”):

BL_MailOut bm = new BL_MailOut(s1,ListViewAdresses());
ObserverDelegate deleg = new ObserverDelegate(Update);
bm.SendMail(deleg);

BL_MailOut构造函数看起来像这样(我们现在在DLL中):

public BL_MailOut(StandardPage page, List<MailAddress> list)
{
    this.s = page;
    this.adresslist = new List<MailAddress>();
    foreach (MailAddress m in list)
    {
        this.adresslist.Add(m);
    }
}

方法SendMail:

public void SendMail(ObserverDelegate deleg)
{
    IO_MailOut im = new IO_MailOut(s, adresslist, deleg);
    Thread t = new Thread(new ThreadStart(im.Send));
    t.Start();
}

最后,我们到达方法Send():

public void Send()
{
    SmtpClient sc;
    MailMessage msg;
    string info;
    foreach (MailAddress adress in this.list)
    {
        try
        {
            sc = new SmtpClient(HOST);
            msg = new MailMessage(SENDER, adress.Address);
            msg.IsBodyHtml = true;
            msg.Subject = "test";
            msg.Body = page.ToString();
            sc.Send(msg);
            info = "(" + DateTime.Now + ") MAIL SENT TO" + Environment.NewLine + adress.Address;
            deleg(info);
        }
    }

我确实抓住了所需的错误,我只是把它留在这里以节省空间。

当达到deleg(info);时,预期的行为是textBox接收所需的文本。但事实并非如此。保留委托的实例,编译器不会出错。我已经在代表的MSDN网站上阅读了这些材料,但没有任何帮助。

2 个答案:

答案 0 :(得分:1)

我在我的程序中做了类似的事情......这就是我做的。

    public void setBoxText(string value)
    {
        if (InvokeRequired)
            Invoke(new SetTextDelegate(setBoxText), value);
        else
            statusBox.Text += value;
    }

    delegate void SetTextDelegate(string value); 

每当我想在框中附加文本时,我都会调用setBoxText。

答案 1 :(得分:1)

表单上的Update方法正在执行跨线程操作,这是不允许的。

将表单上的Update方法更改为此

    private void Update(string info)
    {
     ObserverDelegate callBack =  new ObserverDelegate((x) =>
            {
                this.logBox.Text += Environment.NewLine + info;
            });             

        if (this.InvokeRequired)
            this.Invoke(callBack, info);
        else
          callBack(info);
    }