有一个WinForm程序,在系统托盘处有一个运行图标,程序会定期(Timer控件)到文件服务器上,下载数据文件(如CSV文件),然后分析,存储到数据库中。这个过程会运行的会很慢,所以取数据或者存数据的时候想在系统托盘中右击图标时,会出现假死状态。上网查过使用application.duEvents把这个加在循环处,可是加到了循环(可能会执行时间长的循环)中,运行,右击系统托盘图标,并没有弹出相应的快捷菜单,不知道如何设置,或者用什么办法能弹出来快捷菜单呢?在google后还有一种办法就是用多线程,或者做一个Threadpart的东东,不过好像这样就可以不去用Timer了。
想问的是,如果不使用多线程,那么我要怎么做能让这个菜单弹出来,并且还不会影响取数据等操作,如果要用多线程,我要怎么做怎么把要处理的事情放到这个生成的线程中,还有执行后的线程处理要怎么做呢?好像问的有点多,不过还是感谢各位大虾啦!
这么久没人回答~我来回答一下~
1、如果不使用多线程我想不出什么办法。
2、使用多线程新增线程:
一、如果没有参数传给新的线程可以这样。
Thread receiveSMSTh = new Thread(new ThreadStart(ReceiveReport));
receiveSMSTh.IsBackground = true;
receiveSMSTh.Start();
二、如果需要传参数有可以把新线程的方法写在另一个类里的实例方法中。通过这个类的实例把参数传给这个方法。也可以用下面的方法:
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(getContactThreadPool), e.Node.Tag.ToString());
private void getContactThreadPool(object ob)
{
List<ContactObject> contactList = atc.MyContacts[ob.ToString()];// atc.GetContacts(ob.ToString());
dataGridView1.Invoke(new bindContact(bindContacts), new object[] { contactList });
}
其中:getContactThreadPool是新线程调用的方法。e.Node.Tag.ToString()是传给这个方法的参数。线程完了怎么处理还没用过。我用多线程也就到这个程度~(上面代码是我写手机短信接收程序用到的,翻了很久才翻到~)
如果不用多线程,你看看这个,我刚才找到的:
单线程程序避免界面假死:
1) 使用 void Application.DoEvents();
处理当前在消息队列中的所有 Windows 消息。
2) 使用 void Control.Refresh();
强制控件使其工作区无效并立即重绘自己和任何子控件。Control 可以是 Form,也可以是 Form 上控件。
3) void Control.Update();
使控件重绘其工作区域内的无效区域。Control 只能是 Form 上控件。