无法找出错误原因 跨线程操作从回调到 C# C++无效

本文关键字:回调 操作 无效 C++ 线程 出错 错误 | 更新日期: 2023-09-27 18:32:41

我将像在Objective-C中一样实现委托的MVC结构。基本上我的功能就像蓝牙设备返回我的信号一样,我在C++回调中抓取它,并将该信号消息转发到 C# lambda 函数的回调。我得到以下错误,

跨线程操作无效:从 创建它的线程以外的线程。

我的 C# 代码 Form1.cs,

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
    delegate void ProgressCallback(char theValue);
private void button1_Click(object sender, EventArgs e)
        {
             if (NclWrapper.isNclInitialized())
                {
                    NclWrapper.callNclDiscovery();
                    label1.Text = NclWrapper.getLedPattern();
                    ProgressCallback callback = (theValue) =>
                    {
                      //Crash is here when i going to assign value to lable.
                        this.label1.Text = theValue.ToString();
                        Console.WriteLine("Progress = {0}", theValue);
                    };
                    NclWrapper.DoWork(callback);
                 }
            }
        }

我的 C++ C# 中的 DLL 包装器

[DllImport("My.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
    public static extern void DoWork([MarshalAs(UnmanagedType.FunctionPtr)] ProgressCallback callbackPointer);

我的C++ .cpp课委托作业,

 ProgressCallback myDelegateObject;
    __declspec(dllexport) void DoWork(ProgressCallback progressCallback)
    {
            if (progressCallback)
            {
              myDelegateObject = progressCallback;
            }
    }

发送回电消息C++

void callback(MyEvent event, void* userData){
    wchar_t  ch[6];
    ULONG  ulSize;
    switch(event.type){
/// [callbackInit]
    case MY_EVENT_INIT:
            if(event.init.success) gMyInitialized=true;
            else exit(-1);
            prevEvent = event.type; 
            break;
/// [callbackAgreement]
        case My_EVENT_AGREEMENT:
            gHandle=event.agreement.myHandle;
            for(unsigned i=0; i<My_AGREEMENT_PATTERNS; ++i){
                for(unsigned j=0; j<My_LEDS; ++j){
                    if(event.agreement.leds[i][j]){
                        ch[j]='1';
                    }else{
                        ch[j]='0';
                    }
                }
                std::cout<<"'n";
            }
            ch[5]=''0';
            ulSize = (wcslen(ch) * sizeof(wchar_t)) + sizeof(wchar_t);
            ledPattern = NULL;
            ledPattern = (wchar_t*)::CoTaskMemAlloc(ulSize);
            wcscpy(ledPattern, ch);
            prevEvent = event.type;
            //My delegate callback is here
            myDelegateObject('D');
            break;
        default: break;
    }
}

我错在哪里?

无法找出错误原因 跨线程操作从回调到 C# C++无效

 ProgressCallback callback = (theValue) =>
                    {
                        label1.Invoke((MethodInvoker)delegate {
                             label1.Text = theValue.ToString();
                        });
                    };

此代码内容更新我的标签文本。