2017-04-11 88 views
-1

我正在寻找一种方式来调用在不同线程上的函数跨线程调用(c#,WaveEngine)

我们正在使用一个服务器(gRPC),它在接收到数据时发送数据,一个任务在客户端运行,一旦接收到新数据就会继续循环(stream.MoveNext())。

一旦接收到新的数据将调用一个函数,虽然这是一个不同的线程中完成

注:我没有得到Cross-Thread Exception,这是因为它的构建和测试开发机上是禁用期间不可能。

public static async Task ButtonStream() 
{ 

    var rpc = buttonClient.buttonPressed(new ButtonsSubscription()); 
    try 
    { 
     using (rpc) 
     { 
      var stream = rpc.ResponseStream; 
      while (await stream.MoveNext()) 
      { 
       if (stream.Current.Id >= persistantDic.Count) 
       { 
        int a = stream.Current.Id; 
        int b = persistantDic.Count; 

        //Console.WriteLine("{0} >= {1}", a,b); 
        throw new Exception("Something went wrong"); 
       } 
       else 
       { 
        buttonPressed = stream.Current.Id; 
        gRPCEvents.ButtonUpdates?.Invoke(); 
        Console.WriteLine("Invoked from thread: "+Thread.CurrentThread.ManagedThreadId); 
       } 
      } 
     } 
    } 
    catch (RpcException e) 
    { 
     throw; 
    } 
} 

ButtonUpdates?.Invoke运行中的主要功能(线程ID 1),当我按下F1(仅适用于测试目的),我看到它的运行对线程1的功能,但是当它被调用的线程4(其运行功能或9,有时会改变)。

编辑

在主线程功能是订阅调用的委托,这将是一个任务调用上线4

+3

那么你的问题是什么? –

+0

在不同的线程中调用这些函数的方式是什么 – Maxdg

+1

当你使用'async'时,你*不需要调用。 –

回答

0

解决,只计算逻辑/远程调用,

WaveEngine给我提供了一个简单的解决方案来连接他们的主线程

WaveServices.Dispatcher.RunOnWaveThread(() => 
{ 
    //Any code here for execution 
}); 
+0

你在Wave线程中执行了哪些操作,它是否允许UI控制更新 –

+0

@MrinalKamboj在wavethread上,我更改纹理并为其周围添加动画。 – Maxdg

0

这里有两个要点:

  1. gRPCEvents.ButtonUpdates?.Invoke(),总是意味着在主/ UI线程上工作
  2. 此代码的位置不正确Console.WriteLine("Invoked from thread: "+Thread.CurrentThread.ManagedThreadId);,因为它是一个主线/ Ui线程,无论显示哪个数字,都会不断变化。你想把它使用调用的函数里面MethodInvoker delegate

什么在我的理解你的要求是,如何执行一个单独的线程的更新功能,但你会需要的是自由的UI线程来执行其它功能同时,可能的选项是:

  1. Task<T>.Run(Func<T> function),但是当你等待任务完成时,它仍然会阻塞主线程。
  2. 执行并调用Async版本,该版本可以使用TaskCompletionSource,现在这将有助于切回UI线程以使UI更具功能性并且完成后UI控制可以无缝无缝地更新,因为这就是它的意图去做。
  3. 你可能会被包裹里面Task<T>你的方法并等待它,但是异步封装在一个同步方法不是一个好的做法

EDIT1

记住,如果我不明白,UI控制永远无法更新任何其他线程比主线程在另一个线程