WPF在单独线程上运行函数

WPF在单独线程上运行函数,wpf,vb.net,Wpf,Vb.net,这是个问题,但无论如何 我试图让一个函数在一个单独的线程上运行(它可以工作),但是,我无法接收函数返回的值。这是在wpfvb.netbtw中 我在下面的代码中测试了函数是否返回了正确的值,但MsgBox显示的是空白。我知道你不能简单地将平板(正如我所做的)放入messagebox并期望得到结果,但我真的被卡住了,不知道如何得到结果 Private Sub Button_Click(sender As Object, e As RoutedEventArgs) MsgBox

这是个问题,但无论如何

我试图让一个函数在一个单独的线程上运行(它可以工作),但是,我无法接收函数返回的值。这是在wpfvb.netbtw中

我在下面的代码中测试了函数是否返回了正确的值,但MsgBox显示的是空白。我知道你不能简单地将平板(正如我所做的)放入messagebox并期望得到结果,但我真的被卡住了,不知道如何得到结果

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        MsgBox(Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, New Action(Function() Pathway1A("exit"))))
    End Sub
提前感谢任何能够提供帮助的人。

找到了答案(由于某些原因,它实际上无法再次运行)


有几种方法可以做到这一点,较新版本的DotNet构建在较旧版本的基础上,以提供更简单的功能和语法

首先,您可以启动一个线程并进行同步,直到它发生(本例为阻塞)

或者您可以使用Dotnet2.0的BackgroundWorker

MyResult myResult = null;
var worker = new BackgroundWorker();
worker.DoWork += (Action)(()=> { myResult = ResultOfSomethingThatTakesAWhile();});
worker.RunWorkerCompleted += (Action)(()=> DoSomethingWith(myResult));
有了Dotnet4.0中的TPL,您现在可以使用任务了(这个示例也是阻塞的)

或者,您也可以将async与DotNet 4.5一起使用

 var myResult = await Task.Run(()=> ResultOfSomethingThatTakesAWhile());
 DoSomethingWith(myResult);
最后,如果您真的不关心将结果返回到原始线程,而只是希望将结果处理放到UIThread上,那么您可以使用这些方法中的任何一种来调用新线程,然后调用

Dispatcher.Invoke(()=> DoSomethingWith(myResult));


您是否调试了该函数以获得结果?我知道该函数确实有效,当我在同一线程上运行它时,它会给出所需的结果。例如“Dim A as Integer=Pathway1A(“exit”)”和A将包含我需要的变量,但是当我在单独的线程上运行函数时,我似乎无法获得函数的返回,如上面的代码所示。Erm。这实际上不会在不同的线程上运行!Dispatcher.Invoke在UIThread上运行一个操作,该线程也应该是Button#Click运行的线程。哦,很抱歉,所有这些都是C#示例,而不是VB.Netyea xD,试图破解它们,但还没有时间学习C#。使用转换代码,尽管假设上面的代码是正确的,它仍然有一些翻译错误。我会解决它,并告诉你一切进展如何。
 var t = Task.Run(() => { return ResultOfSomethingThatTakesAWhile(); });
 t.Wait();
 DoSomethingWith(t.Result);
 var myResult = await Task.Run(()=> ResultOfSomethingThatTakesAWhile());
 DoSomethingWith(myResult);
Dispatcher.Invoke(()=> DoSomethingWith(myResult));
WinFormsControl.Invoke(()=> DoSomethingWith(myResult));