日期:2014-05-17  浏览次数:21083 次

C#线程问题求教
这个问题是我在使用DIGITAL PERSONA的URU指纹识别SDK的时候遇到的,大致的代码如下:

C# code

// 这个interface 是SDK提供的,它的内部详细内容我不了解
interface Eventhandler
{
    public void OnSomeEvent();
}

// 这个class 是SDK提供的,它的内部详细内容我不了解
public class FingerPrintCapturer
{
    public EventHandler CapturerEventHandler;
}

// 我的自定义类
public class MyForm: Form, EventHandler
{
    private FingerPrintCapturer FPCapturer;
    private Label label1;

    public Class1()    
    {
        FPCapturer = new FingerPrintCapturer(); // 似乎这个对象运行在一个新线程中
        FPCapturer.CapturerEventHandler = this; // 实际上这一行的接口赋值也一直没搞懂,相关帖子见下文
    }

    // 似乎是这个函数运行在一个新线程中
    public void OnSomeEvent()
    {
        // method definition
    }

    private void ModifyStatusLabel()
    {
        // 下面这行报告跨线程操作的一个错误
        // Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.
        this.label1.Text = "SOME TEXT"; 
    }
}




我以前只用过C++ boost的线程,对C#的线程了解还不多,上面这段代码只是为了说明一下问题,我自己大致的理解是:
FingerPrintCapturer的实例FPCapturer运行在一个新线程中,而FPCapturer中OnSomeEvent()函数是在MyForm中实现的,因此当OnSomeEvent()函数调用的MyForm其他函数时带来了跨线程操作的问题,但是具体如何解决我不知道,高手万万不能见死不救啊


顺便说,关于那个接口赋值的问题,一直也没弄明白是怎么回事,有经验的请帮我在这个帖子上回答一下:
http://topic.csdn.net/u/20120925/21/3e596554-0436-414e-b6c7-99e74e4d8d84.html

------解决方案--------------------
用委托,请看c#委托的相关帮助和介绍.
------解决方案--------------------
http://www.cnblogs.com/txw1958/archive/2012/08/21/csharp-crossthread-widget.html