无法找出错误原因 跨线程操作从回调到 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;
}
}
我错在哪里?
ProgressCallback callback = (theValue) =>
{
label1.Invoke((MethodInvoker)delegate {
label1.Text = theValue.ToString();
});
};
此代码内容更新我的标签文本。