我有一个使用信号器集线器的WinForms C#.NET 4.5.2 OWIN自托管服务器。在同一个WinForm项目中,我按如下方式启动信号器集线器:
private void Form1_Load(object sender, EventArgs e) {
hubConnection = new HubConnection("http://localhost:12345/", clientParams);
hubProxy = hubConnection.CreateHubProxy("OfmControl");
hubProxy.On("Message", message => onData(message));
hubConnection.Start();
我的onData方法如下所示:
private void onData(dynamic message)
{
var file = new System.IO.FileInfo(message);
playVideo(file.FullName);
}
playVideo方法如下所示:
private void playVideo(string file)
{
int tc6 = 0;
try
{
axWMPn[0].URL = file;
}
catch (System.Runtime.InteropServices.COMException comEx)
{
Console.WriteLine("playVideo COMException 0: " + comEx.Source + " -- " + comEx.Message);
}
}
axWMPn是主窗体上的activex Windows Media Player对象。当我运行一个单独的C#signalr客户端程序并向该OWIN信号器服务器发送文件名消息并且onData接收文件名并按照上面的代码将其分配给axWMPn [0]它总是工作从不命中catch异常永远不会收到跨线程异常?我已经运行了数百次从未收到过线程异常并始终有效吗?但是,如果我执行以下操作,我每次都会收到一个跨线程异常:
private void onData(dynamic message)
{
textBox1.text = message; ---> cross thread exception everytime here
var file = new System.IO.FileInfo(message);
playVideo(file.FullName);
}
我开始认为我正在做的是一个跨线程违规,但是为什么它总是有效我为什么在调试模式下运行项目时没有收到Visual Studio中的线程冲突,就像我在尝试分配textBox1时一样onData中的.text?我有一种感觉,它与axWMP是一个activex COM对象有关,但似乎我最终应该有一个交叉线程异常,如果是的话?
如果是跨线程冲突,我是否需要围绕axWMPn [0]赋值执行BeginInvoke / Invoke? 谢谢你的任何建议......