编辑:这是一个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网站上阅读了这些材料,但没有任何帮助。
答案 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);
}