【发布时间】: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