hubProxy.On(" Message",message => onData(message))什么线程?

时间:2017-10-09 19:13:16

标签: c# multithreading signalr owin

我有一个使用信号器集线器的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? 谢谢你的任何建议......

0 个答案:

没有答案