C# 线程完成时如何获取返回值
我正在尝试使用多线程执行一个长进程。如何从线程中获取resutn值?如果我能得到返回值,我将根据返回值更新数据库 这是我调用线程的代码C# 线程完成时如何获取返回值,c#,wpf,multithreading,return,C#,Wpf,Multithreading,Return,我正在尝试使用多线程执行一个长进程。如何从线程中获取resutn值?如果我能得到返回值,我将根据返回值更新数据库 这是我调用线程的代码 foreach (var obj in elements) { string body_ = @"<html><head></head><body><a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answe
foreach (var obj in elements) {
string body_ = @"<html><head></head><body><a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answer=yes'>Evet</a> - <a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answer=no'>Hayır</a></body></html>";
Thread thread = new Thread(() => sendEmailThread(obj.ALICI, obj.KONU, body_));
thread.Start();
}
这是真正的电子邮件发送者
public int sendEmail(string to_,string subject_,string body_) {
.......
.......
.......
return 1;
}
与自己创建线程相比,它提供了许多优势,而不是使用线程 您的代码可以更改为以下内容:
var task = Task<int>.Factory.StartNew(
() => sendEmailThread(obj.ALICI, obj.KONU, body_));
task.ContinueWith(() => {var result = task.Result;});
这说明了为什么您应该使用Task.RunoverBackgroundWorker,而不是使用您可以使用的线程,这比您自己创建线程有很多优势 您的代码可以更改为以下内容:
var task = Task<int>.Factory.StartNew(
() => sendEmailThread(obj.ALICI, obj.KONU, body_));
task.ContinueWith(() => {var result = task.Result;});
这说明了为什么应该使用Task.Run over BackgroundWorker在这种情况下,您可以将代码放在sendEmail的末尾,或者作为委托的一部分创建如下线程:
private void sendEmailThread(string ALICI, string KONU, string body_)
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() {
var result = sendEmail(ALICI, KONU, body_);
SomeDBUpdate(result);
} );
}
更好的方法是在代码中放入一个名为OnEmailSendComplete的eventhandler,并将返回类型传递给该处理程序
也就是说,如果以上都是您的代码所做的,那么使用新的异步方法比编写自己的线程处理更整洁 在这种情况下,您可以将代码放在sendEmail的末尾,或者作为委托的一部分创建如下线程:
private void sendEmailThread(string ALICI, string KONU, string body_)
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() {
var result = sendEmail(ALICI, KONU, body_);
SomeDBUpdate(result);
} );
}
更好的方法是在代码中放入一个名为OnEmailSendComplete的eventhandler,并将返回类型传递给该处理程序
也就是说,如果以上都是您的代码所做的,那么使用新的异步方法比编写自己的线程处理更整洁 .NET中存在BackgroundWorker类,这是在后台处理耗时任务的正确方法。试着这样做:
foreach (var obj in elements) {
BackgroundWorker bw = new BackgroundWorker();
string body_ = @"<html><head></head><body><a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answer=yes'>Evet</a> - <a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answer=no'>Hayır</a></body></html>";
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync(-- your params here --)
}
您需要创建DoWork和RunWorkerCompleted处理程序,但我相信您可以在internet上找到很多教程,例如:
NET中存在BackgroundWorker类,这是在后台处理耗时任务的正确方法。试着这样做:
foreach (var obj in elements) {
BackgroundWorker bw = new BackgroundWorker();
string body_ = @"<html><head></head><body><a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answer=yes'>Evet</a> - <a href='http://localhost:5111/Default.aspx?id=" + obj.ID + @"&answer=no'>Hayır</a></body></html>";
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync(-- your params here --)
}
您需要创建DoWork和RunWorkerCompleted处理程序,但我相信您可以在internet上找到很多教程,例如:
您无法从线程中获取返回值。新的async/await可能更适合您。我怎么知道线程是否完成了它的任务?您可以使用async/await模式吗?我从未使用过它,但我现在将阅读它。您不会从线程中获得返回值。新的async/await可能更适合您。我如何知道线程是否完成了任务?您可以使用async/await模式吗?我从未使用过它,但现在我将阅读它。它是处理DoWork事件的函数名。例如:private void bw_DoWorkobject sender,DoWorkEventArgs e{BackgroundWorker worker=sender as BackgroundWorker;…}。它是处理DoWork事件的函数名。例如:private void bw_DoWorkobject sender,DoWorkEventArgs e{BackgroundWorker worker=sender as BackgroundWorker;…}