跨线程调用(c#、WaveEngine)
Cross Thread invoke (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
在 main(threadID 1) 中运行一个函数,当我按 F1(仅测试目的)时,我看到它的 运行 是线程 1 上的函数,但是当它被调用时运行 在线程 4(或 9,有时会更改)上运行。
编辑
主线程上的函数订阅了调用的委托,它将由线程 4 上的任务调用
已解决,
WaveEngine 非常友善,为我提供了一个简单的解决方案来连接到他们的主线程
WaveServices.Dispatcher.RunOnWaveThread(() =>
{
//Any code here for execution
});
我正在寻找一种方法来在不同的线程上调用函数。
我们正在使用一个服务器 (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 上的任务调用
已解决,
WaveEngine 非常友善,为我提供了一个简单的解决方案来连接到他们的主线程
WaveServices.Dispatcher.RunOnWaveThread(() =>
{
//Any code here for execution
});