从Thread.Start()的委托函数访问返回值

bug*_*ixr 6 c# multithreading

我有一个程序通过Thread.Start执行一个方法.该方法具有我想要访问的返回值.有没有办法做到这一点?这是一个抽样......

var someValue = "";
Thread t = new Thread(delegate() { someValue = someObj.methodCall(); });

t.Start();

while (t.isAlive) Thread.Sleep(1000);

// Check the value of someValue
Run Code Online (Sandbox Code Playgroud)

因此,一旦while循环结束,someValue应该被设置 - 但是因为它在另一个线程中执行它不会被设置.有一种简单的方法可以访问它吗?

Jef*_*nal 6

当调用者和线程方法共享一个变量时,你已经可以访问它 - 一旦线程完成,你只需要检查someValue.

当然,您必须知道线程方法何时完成才有用.在底部,有两种方法可以做到这一点:

  • 将回调函数发送到完成后可以执行的线程方法.您可以传递回调方法someValue.如果你不关心回调执行时,你可以使用这种技术.

  • 使用WaitHandle某种(或Thread.Join).它们告诉您资源何时准备好或事件已完成.如果您想要启动一个线程,执行其他操作,然后等到线程完成再继续之前,此技术很有用.(换句话说,如果你想要与线程同步备份,那就很有用了.)


Jac*_*ald 5

我无法重现你的问题,我有相同的代码,我看到了预期的结果.如果你只是打算睡觉当前线程,直到它完成,你可以在线程上调用.Join()并等待确保它已完成执行.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    string someValue = "";

    private void Form1_Load(object sender, EventArgs e)
    {

        Thread t = new Thread(delegate() { someValue = "asdf"; });

        t.Start();
        t.Join();

        //while (t.IsAlive) Thread.Sleep(1000);

        System.Diagnostics.Debug.Print(someValue);

    }
}
Run Code Online (Sandbox Code Playgroud)

  • Chu:你所描述的是BackgroundWorker组件的经典场景(如果你使用的是Windows Forms).这比一次睡眠UI线程好一点. (4认同)