我现在编写一个读取射频卡的程序   知道form程序中 开启多线程是个麻烦事  就写了如下代码
namespace 邵阳读写卡
{
    public partial class Form1 : Form
    {        public Form1()
        {
            InitializeComponent();
            if (ccidclasscs.LinkCard())
            {        ////这是一段根据设备要求连接读卡器的代码
             }
            else
            {
                MessageBox.Show("连接设备失败");
            }
        }        private void Form1_Load(object sender, EventArgs e)
        {
            ///开始启动一个线程准备来调用一个  委托
            Thread thread = new Thread(new ThreadStart(f1));
            thread.IsBackground = true;
            thread.Start();
        }        private delegate int myInvokeMethod();        private void f1()  ///被线程调用的函数
        {
            myInvokeMethod methodinvoke = new myInvokeMethod(f2);
            while ((int)Invoke(methodinvoke) == -1)
            {
                   //这里开始调用委托了
            }
        }       ///  ccidclasscs是厂商提供的一个读卡类 打包好的
       ///  ReadCardData 是用来从指定的RFC卡块区读数据的方法  由于这个方法      
       ///  不是一个阻塞的方法,我只能用个循环来不断的读数据 这样当用户放上卡后就能读出来
       ///  GetErr是个读设备错误代码的方法, 当用户没有放上卡的时候 就会丢 “读卡失败” 这种中文信息        private int f2()
        {
            this.Refresh(); 
            StringBuilder rcarddata = new StringBuilder();
            StringBuilder err = new StringBuilder();            ccidclasscs.ReadCardData(rcarddata, 4, 0, "FFFFFFFFFFFF");
            ccidclasscs.GetErr(err);
            if (err.ToString() == "读卡失败")
            {
                return -1;
            }
            if (rcarddata.ToString() != "000000000919")
            {
                //continue;//卡机上的卡不是管理员的卡,中断这次循环。
                return -1;
            }
            return 0;        }
    }//类定义结束
}//命名空间定义结束
这个程序能够运行,并且也能够同时相应用户关闭程序的操作,就是当我拖动这个程序的时候,还是感觉程序很卡,感觉程序拖不动, 有什么办法可以让程序对我的操作更加敏感呢???

解决方案 »

  1.   

    刚看到一个和楼主一样的问题,试试BackgroundWorker,或者异步调用
      

  2.   

    我用了后台线程属性啊   thread.IsBackground = true;
      

  3.   

    CheckForIllegalCrossThreadCalls = false; ??
      

  4.   

    while ((int)Invoke(methodinvoke) == -1)
                {
                       //这里开始调用委托了
                }在这里面加一个Sleep(100)试试。
      

  5.   

    BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题
      

  6.   

    学到一手  backgroundworker类  好