单独线程上的WPF运行函数

时间:2013-11-14 04:36:37

标签: wpf vb.net

这里非常苛刻的问题,但无论如何。

我正在尝试让一个函数在一个单独的线程上运行(它可以工作),但是,我无法接收该函数返回的值。这是在WPF VB.Net btw。

我的代码如下,我已经测试过该函数返回了一个正确的值,但是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

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

2 个答案:

答案 0 :(得分: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);

或者您可以使用与DotNet 4.5的异步

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

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

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

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

答案 1 :(得分: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