C# - 在Thread中使用带有"out"参数的函数

Ala*_*lah 3 c# multithreading function out-parameters

我有以下功能,我想在以下内容中使用它System.Threading.Thread:

private void tempFunction(int num, out string fullname, out string info)
{
    // Doing a very long scenario.
    // When finished, send results out!
    fullname = result1;
    info = result2;
}
Run Code Online (Sandbox Code Playgroud)

我试过在(button_Click)事件处理程序中使用以下代码:

private void submit_Button_Click(object sender, RoutedEventArgs e)
{
    string Fullname = string.Empty, Info = string.Empty;
    int index = 132;

    Thread thread = new Thread(() => tempFunction(index, out Fullname, out Info));
    thread.Start();
    thread.Join();

    // I always use "MessageBox" to check if what I want to do was done successfully
    MessageBox.Show(Fullname + "\n" + Info);
}
Run Code Online (Sandbox Code Playgroud)

你可以看到我使用,thread.Join();因为我需要等待,直到Thread完成以获得线程进程的结果.

但上面的代码似乎不起作用,它只是冻结,我不知道为什么!

所以我肯定做错了什么,你能告诉我怎么做我想要的吗?

Use*_*678 12

程序冻结的事实与out参数没有任何关系.

该程序冻结,因为你调用Thread.Join()哪个基本上读取:"阻止调用线程,直到我完成处理".因为调用线程是UI线程,所以UI冻结.

有很多方法可以解决这个问题,其中最吸引人的方法是使用 await关键字(C#5),但鉴于对.NET 4.5的依赖,您可以选择手动附加延续:

Task.Factory.StartNew(() => tempFunction(index, out Fullname, out Info))
            .ContinueWith(r => MessageBox.Show(Fullname + "\n" + Info));
Run Code Online (Sandbox Code Playgroud)

(您将需要以.NET 4.0为目标才能使用Task该类.)

如果您仅限于该框架的早期版本,则下一个最佳解决方案可能是使用BackgroundWorker似乎正在使用Windows窗体应用程序的组件.