2012-09-03 44 views
0

我有以下的功能,最初被从UI(主)的线程调用:使用线程池适当

private void BreakToggle(int line, Boolean toggle) 
    { 
     string flag; 
     if (toggle) 
     { 
      flag = "0"; //Add 
     } 
     else 
     { 
      flag = "1"; //Delete 
     } 
     string logicLine = line.ToString(); 

     SetLogicBreakLineResponse response = ddcdao.SetLogicBreakLine(logicName, logicLine, flag); 
    } 

然而,底线试图建立与电子装置连接并发送一个信号,该信号如果连接速度慢,可能需要5秒钟。所以为了防止用户界面挂起,我决定做一个单独的线程来处理这个问题。

这个函数也可以在很短的时间内被调用很多次(比如1秒内的10次),所以我想通过使用Threadpool来代替背景工作,所以我修改了我的代码像这样:

ThreadPool.QueueUserWorkItem(state => 
{ 
     SetLogicBreakLineResponse response = ddcdao.SetLogicBreakLine(logicName, logicLine, flag); 
}); 

这是使用Threadpool的正确方法吗?如果使用线程很简单,我觉得我肯定做错了什么。此代码是否会导致我的应用程序出现任何未知的伏都教?

+0

它看起来像是放弃了回应。这是你的意图吗?如果多次拨打电话,订单或对设备的呼叫很重要? – rene

回答

2

你的例子是使用线程池的合理开始。它可以像这样简单,如果你唯一感兴趣的只是让代码在UI线程之外运行。

但是,你应该知道你的原始代码和多线程版本之间的行为差​​异:

  • 的MT版本不保证其顺序排队的操作将运行
  • 的MT版本允许一次运行多个操作的可能性,这意味着SetLogicBreakLine需要重入
  • 使用闭包捕获引用类型的值可以让它们的成员在安排它们之后并且在它们运行之前被突变

您确实需要考虑这些差异,但如果MT行为没有问题,那么它就如此简单。

+0

感谢您的详细解答! – l46kok

+0

好点。另一个有趣的是,GUI的更新不应该从线程池线程完成,而是转发到GUI线程。 – Tudor

1

我觉得我肯定是做错了,如果使用线程是很容易的。

你没有做错任何事情,ThreadPool的整点是使线程的使用更加高效&容易。我要说的唯一的事情是,如果你需要在线程之外使用response,你可能需要重新考虑你的代码。

+0

啊,我会在ThreadPool内部做一些响应。为了说明的目的,我想尽量减少代码。谢谢你的回答。 – l46kok