gpt4 book ai didi

c# - C# 中的委托(delegate)问题、表单和多种解决方案

转载 作者:行者123 更新时间:2023-11-30 17:23:15 24 4
gpt4 key购买 nike

编辑:这是一个 winform 应用程序,对于给您带来的不便,我们深表歉意

免责声明:这是我们在大学时布置的作业,我一直在研究这个特定的代码部分。

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

DLL 的一个类只包含一个委托(delegate):

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委托(delegate)“业务层”):

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); 时,预期的行为是文本框收到所需的文本。然而,事实并非如此。委托(delegate)的实例被保留,编译器没有给出错误。我已经阅读了 MSDN 站点上有关 Delegates 的 Material ,但没有任何帮助。

最佳答案

您在表单上的 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);
}

关于c# - C# 中的委托(delegate)问题、表单和多种解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com