0

这里非常nooby问题,但无论如何。

我试图让一个函数在一个单独的线程上运行(它可以工作),但是我无法接收到函数返回的值。这是在 WPF VB.Net 顺便说一句。

我在下面的代码中测试了该函数是否返回了正确的值,但 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

提前感谢任何可能提供帮助的人。

4

2 回答 2

2

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

首先你可以启动一个线程并同步直到它发生(这个例子是阻塞的)

MyResult myResult = null;
ManualResetEvent synchronizer = new ManualResetEvent();

public void Caller()
{
  new Thread(new ThreadStart(CalculateResult)).Start();
  synchronizer.WaitOne();
  DoSomethingWith(myResult);
}

public void CalculateResult()
{      
  myResult = ResultOfSomethingThatTakesAWhile();

  synchronizer.Set();
}

或者您可以使用 DotNet 2.0 中的 BackgroundWorker

MyResult myResult = null;
var worker = new BackgroundWorker();
worker.DoWork += (Action)(()=> { myResult = ResultOfSomethingThatTakesAWhile();});
worker.RunWorkerCompleted += (Action)(()=> DoSomethingWith(myResult));

使用 DotNet 4.0 中的 TPL,您现在可以使用任务(同样,这个示例是阻塞的)

 var t = Task.Run(() => { return ResultOfSomethingThatTakesAWhile(); });
 t.Wait();
 DoSomethingWith(t.Result);

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

 var myResult = await Task.Run(()=> ResultOfSomethingThatTakesAWhile());
 DoSomethingWith(myResult);

最后,如果您并不真正关心将结果返回给原始线程,而只是想将结果处理到 UIThread 上,那么您可以使用这些方法中的任何一个来调用新线程,然后调用

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

或者

WinFormsControl.Invoke(()=> DoSomethingWith(myResult));
于 2013-11-14T07:42:17.560 回答
0

找到了答案(编辑实际上由于某种原因它不再起作用)

Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim A As Integer
        Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, New Action(Function() A = Pathway1A("exit")))
        Msgbox(A)
    End Sub
于 2013-11-14T07:13:54.790 回答