我正在尝试使用多线程进行长时间处理。如何从线程中获取结果值?如果我能得到返回值,我会根据返回值更新数据库。
这是我调用线程的代码...
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 而不是 BackgroundWorker
关于c# - 如何在线程完成时获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26972464/