c#跨线程操作问题

最近在弄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个参数(可以定义一个类,将参数包装到类中)。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值