Returning a value from thread?

前端 未结 17 2413
不思量自难忘°
不思量自难忘° 2020-11-27 09:45

How do I return a value from a thread?

17条回答
  •  醉梦人生
    2020-11-27 10:43

    I would use the BackgroundWorker approach and return the result in e.Result.

    EDIT:

    This is commonly associated with WinForms and WPF, but can be used by any type of .NET application. Here's sample code for a console app that uses BackgroundWorker:

    using System;
    using System.Threading;
    using System.ComponentModel;
    using System.Collections.Generic;
    using System.Text;
    
    namespace BGWorker
    {
        class Program
        {
            static bool done = false;
    
            static void Main(string[] args)
            {
                BackgroundWorker bg = new BackgroundWorker();
                bg.DoWork += new DoWorkEventHandler(bg_DoWork);
                bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
                bg.RunWorkerAsync();
    
                while (!done)
                {
                    Console.WriteLine("Waiting in Main, tid " + Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(100);
                }
            }
    
            static void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                Console.WriteLine("Completed, tid " + Thread.CurrentThread.ManagedThreadId);
                done = true;
            }
    
            static void bg_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 1; i <= 5; i++)
                {
                    Console.WriteLine("Work Line: " + i + ", tid " + Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(500);
                }
            }
        }
    }
    

    Output:

    Waiting in Main, tid 10
    Work Line: 1, tid 6
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Work Line: 2, tid 6
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Work Line: 3, tid 6
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Work Line: 4, tid 6
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Work Line: 5, tid 6
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Waiting in Main, tid 10
    Completed, tid 6
    

    2014 UPDATE

    See @Roger's answer below.

    https://stackoverflow.com/a/24916747/141172

    He points out that you can use a Task that returns a Task, and check Task.Result.

提交回复
热议问题