[英]how to get return value when a thread is done
我试图用多线程做一个漫长的过程。 我如何从线程中获得资源价值? 如果可以获取返回值,则将根据返回值更新数据库。
这是我的调用线程的代码...
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();
}
这是线程调用程序.....
private void sendEmailThread(string ALICI, string KONU, string body_)
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { sendEmail(ALICI, KONU, body_); } );
}
这是真正的电子邮件发件人
public int sendEmail(string to_,string subject_,string body_) {
.......
.......
.......
return 1;
}
除了使用线程,您还可以使用Task
,它比创建自己的线程具有许多优势
您的代码可以更改为以下内容:
var task = Task<int>.Factory.StartNew(
() => sendEmailThread(obj.ALICI, obj.KONU, body_));
task.ContinueWith(() => {var result = task.Result;});
更新为了获得类似于BackgroundWorker的行为,您应该使用TaskScheduler.FromCurrentSynchronizationContext()将您的任务与当前UI线程同步,以便上面的代码可以这样编写:
var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();
task.ContinueWith(() => { var result = task.Result; }, UISyncContext);
article
说明了为什么应使用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”,然后将返回类型传递给处理程序。
就是说,如果以上是代码的全部工作,而不是编写自己的线程处理方法,那么使用新的Async方法将变得更加整洁。
.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上找到很多教程,例如:
http://msdn.microsoft.com/zh-CN/library/cc221403(v=vs.95).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.