繁体   English   中英

线程完成后如何获取返回值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM