c#跨线程操作问题
2015-09-11 16:56
405 查看
最近在弄c#调用c++接口,通过回调函数上传数据,在c#界面显示。由于该接口为同步(阻塞),回调部分会卡住界面,只有全部数据加载完了才会显示出来。这里通过子线程的方法来操作主界面,让主界面显示出来后,数据一条条显示。
外部调用接口:
public void SelfAutoDetect()
{
Thread thread = new Thread(BeginDetect);
thread.Start();
}
private void BeginDetect()
{
IBGISequence.SelfDetectCb callback = new IBGISequence.SelfDetectCb(CallbackFunc);
IBGISequence.Seq_AutoSelfDetect(callback);
}
方法1,Invoke和BeginInvoke方法
前者为同步,后者为异步,所以采用后者。
委托:
public delegate void UpdateData(string name, int result);
public event UpdateData updateData;
事件:
this.updateData += SelfDetectCtrl_updateData;
实现:
private void CallbackFunc(IntPtr devname, int result)
{
// 异步刷新ui
BeginInvoke(updateData, new object[] { Marshal.PtrToStringAuto(devname), result });
}
void SelfDetectCtrl_updateData(string name, int result)
{
// 操作ui控件,如listview等
}
方法2:WindowsFormsSynchronizationContext
有Post(异步)和Send(同步)方法,采用Post
定义:
private WindowsFormsSynchronizationContext sync = WindowsFormsSynchronizationContext.Current as WindowsFormsSynchronizationContext;// 线程间异步对象
使用:
private void CallbackFunc(IntPtr devname, int result)
{
// 异步刷新ui
sync.Post(Func, object obj);
}
void Func(object obj)
{
// 操作ui控件,如listview等,将obj转换为相应的对象,如int a = obj as int;
}
总结:
这两种方法都提供了子线程操作ui,方法类似,不同之处在于方法1可以传递多个参数,方法2只能传递1个参数(可以定义一个类,将参数包装到类中)。
外部调用接口:
public void SelfAutoDetect()
{
Thread thread = new Thread(BeginDetect);
thread.Start();
}
private void BeginDetect()
{
IBGISequence.SelfDetectCb callback = new IBGISequence.SelfDetectCb(CallbackFunc);
IBGISequence.Seq_AutoSelfDetect(callback);
}
方法1,Invoke和BeginInvoke方法
前者为同步,后者为异步,所以采用后者。
委托:
public delegate void UpdateData(string name, int result);
public event UpdateData updateData;
事件:
this.updateData += SelfDetectCtrl_updateData;
实现:
private void CallbackFunc(IntPtr devname, int result)
{
// 异步刷新ui
BeginInvoke(updateData, new object[] { Marshal.PtrToStringAuto(devname), result });
}
void SelfDetectCtrl_updateData(string name, int result)
{
// 操作ui控件,如listview等
}
方法2:WindowsFormsSynchronizationContext
有Post(异步)和Send(同步)方法,采用Post
定义:
private WindowsFormsSynchronizationContext sync = WindowsFormsSynchronizationContext.Current as WindowsFormsSynchronizationContext;// 线程间异步对象
使用:
private void CallbackFunc(IntPtr devname, int result)
{
// 异步刷新ui
sync.Post(Func, object obj);
}
void Func(object obj)
{
// 操作ui控件,如listview等,将obj转换为相应的对象,如int a = obj as int;
}
总结:
这两种方法都提供了子线程操作ui,方法类似,不同之处在于方法1可以传递多个参数,方法2只能传递1个参数(可以定义一个类,将参数包装到类中)。
相关文章推荐
- C# 时间格式(血淋淋的教训啊。。。)
- C# WinForm开发系列 - DataGridView
- C#(U盘加载,卸载,拔出,插入,WM_DEVICECHANGE,WndProc,DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE)
- C#泛型的使用
- C#并行编程-并发集合
- C#高级------拉姆达表达式
- C#委托------匿名方法
- 问题:C#属性;结果:c# 属性
- c#图片压缩
- c# 常规验证基类
- XLT格式化XML那点事(C#代码中的问题解决)(二)
- C# 读写Excel、CVS
- C#通用类库--DOS常用命令
- C# .net Emoji字体 Unicode编码转UTF16内码字符串输出
- C#高级------委托
- C#值类型和引用类型浅析
- C#高级------正则验证邮箱
- C# Enum 简易权限设计 使用FlagsAttribute属性
- C#输出日历
- C#—委托