[6月27日]解决马上给分

时间:2022-05-24 14:05:19
通过动态 我new了100个 Axzkemkeeper.AxCZKEM ax 对象,并且注册事件时都是OnAttTransactionEx(这100个对象是给100台考勤机设置的,当用户在1~100的考勤机打卡时,就触发下面这个事件)

我的问题:主界面卡。
一触发这个事件 主界面就定住了, 请问根据 我的情况这个问题如何解决。  (请举例子,或简单代码)

 private void ax_OnAttTransactionEx(object sender, Axzkemkeeper._IZKEMEvents_OnAttTransactionExEvent e)
        {
           //....         
        }

10 个解决方案

#1


多线程

#2


将ax_OnAttTransactionEx要执行的代码用一个子线程去实现,不然你的界面肯定会因为等待该方法执行完毕而假死。

#3


比较简单的用BackgroundThread控件:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Threading.UI.Winforms
{
    public partial class BackgroundWorkerBadExample : Form
    {
        public BackgroundWorkerBadExample()
        {
            InitializeComponent();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                for (int i = 0; i < (int)e.Argument; i++)
                {
                    txtResults.Text += string.Format(
                        "processing {0}\r\n", i.ToString());
                }
            }
            catch (InvalidOperationException oex)
            {
                MessageBox.Show(oex.Message);
            }

        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, 
            RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Completed background task");
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(100);
        }
    }
}


以上代码来自下面的文章:
http://www.codeproject.com/Articles/28485/Beginners-Guide-to-Threading-in-NET-Part-5-of-n

#4


触发事件后,开启线程,在后面执行,完后通过委托或消息通知主进程

#5


典型的多线程问题

#6


用多线程

3楼不错

#7


引用 4 楼  的回复:
触发事件后,开启线程,在后面执行,完后通过委托或消息通知主进程


+1

#8



多线程应该可以解决你的问题!

#9


引用 3 楼  的回复:
比较简单的用BackgroundThread控件:


C# code


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.……

用了这个方法,主界面还是会卡住2秒。

#10



  int dwMachineNumber = 0;
  int dwinfo = 2;
  int dwvalues = 0;
         
  Axzkemkeeper.AxCZKEM ax = (Axzkemkeeper.AxCZKEM)sender;   
  //这个方法需要2秒才能处理。这期间主界面会卡住
  ax.GetDeviceInfo(dwMachineNumber, dwinfo, ref dwvalues);
  
可否提供一些简单的事例代码呢

#1


多线程

#2


将ax_OnAttTransactionEx要执行的代码用一个子线程去实现,不然你的界面肯定会因为等待该方法执行完毕而假死。

#3


比较简单的用BackgroundThread控件:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Threading.UI.Winforms
{
    public partial class BackgroundWorkerBadExample : Form
    {
        public BackgroundWorkerBadExample()
        {
            InitializeComponent();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                for (int i = 0; i < (int)e.Argument; i++)
                {
                    txtResults.Text += string.Format(
                        "processing {0}\r\n", i.ToString());
                }
            }
            catch (InvalidOperationException oex)
            {
                MessageBox.Show(oex.Message);
            }

        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, 
            RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Completed background task");
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(100);
        }
    }
}


以上代码来自下面的文章:
http://www.codeproject.com/Articles/28485/Beginners-Guide-to-Threading-in-NET-Part-5-of-n

#4


触发事件后,开启线程,在后面执行,完后通过委托或消息通知主进程

#5


典型的多线程问题

#6


用多线程

3楼不错

#7


引用 4 楼  的回复:
触发事件后,开启线程,在后面执行,完后通过委托或消息通知主进程


+1

#8



多线程应该可以解决你的问题!

#9


引用 3 楼  的回复:
比较简单的用BackgroundThread控件:


C# code


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.……

用了这个方法,主界面还是会卡住2秒。

#10



  int dwMachineNumber = 0;
  int dwinfo = 2;
  int dwvalues = 0;
         
  Axzkemkeeper.AxCZKEM ax = (Axzkemkeeper.AxCZKEM)sender;   
  //这个方法需要2秒才能处理。这期间主界面会卡住
  ax.GetDeviceInfo(dwMachineNumber, dwinfo, ref dwvalues);
  
可否提供一些简单的事例代码呢