c# - 如何在线程完成时获取返回值

标签 c# wpf multithreading return

我正在尝试使用多线程进行长时间处理。如何从线程中获取结果值?如果我能得到返回值,我会根据返回值更新数据库。

这是我调用线程的代码...

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/

相关文章:

c++ - 在两个线程中使用 C++ 堆栈

wpf - 获取仅包含文本条目的组合框的选定文本的最简单方法是什么?

wpf - 创建自定义项目控件

c# - 静态构造函数之前的异步加载设置

c# - ICorProfilerCallback2 : CLR profiler does not log all Leave calls

wpf - 任何免费的 3D 旋转木马控件可用吗?

c++ - QThread:使用 GUI 反馈阻塞进行并行执行?

两个类之间的python线程无法正常工作

c# - 从 C# 生成 json 的最佳方法是什么

c# - 使用HSQL进行.NET开发及流程相关问题