Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程完成时如何获取返回值_C#_Wpf_Multithreading_Return - Fatal编程技术网

C# 线程完成时如何获取返回值

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

我正在尝试使用多线程执行一个长进程。如何从线程中获取resutn值?如果我能得到返回值,我将根据返回值更新数据库

这是我调用线程的代码

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;…}