交叉线程调用(c#,WaveEngine)

时间:2017-04-11 08:05:22

标签: c# multithreading grpc

我正在寻找一种方法在不同的线程上调用一个函数

我们正在使用一个服务器(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在main(threadID 1)中运行一个函数,当我按F1(仅测试目的)时,我看到它在线程1上运行该函数,但是当它在线程4上调用它的运行函数时(或9,有时会改变。)

修改

主线程上的函数订阅了调用的委托,该委托将由线程4上的任务调用

1 个答案:

答案 0 :(得分:0)

解决了,

WaveEngine非常友好地为我提供了一个简单的解决方案来连接他们的主线程

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