【问题标题】:Cross Thread invoke (c#, WaveEngine)跨线程调用 (c#, WaveEngine)
【发布时间】:2017-09-06 11:58:01
【问题描述】:

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

我们正在使用一个服务器(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 上的任务调用

【问题讨论】:

  • 那么您的问题/疑问是什么?
  • 跨不同线程调用这些函数的正确方法是什么
  • 不需要在使用async时需要调用。
  • @PanagiotisKanavos OP 想要发布它以便在单独的线程上调用一些更新函数,我假设它有一些处理逻辑
  • @MrinalKamboj runs a function within main(threadID 1) 这是 UI 线程。如果 UI 线程调用 ButtonStream,则不需要 Invoke

标签: c# multithreading grpc


【解决方案1】:

已解决,

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

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

【讨论】:

  • 在Wave线程中执行什么操作,是否允许Ui控件更新
  • @MrinalKamboj 在 wavethread 上,我改变了周围的纹理和动画对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多