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