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 秒的时间。所以为了防止 UI 挂起,我决定创建一个单独的线程来处理这个问题。

这个函数也可以在短时间内被多次调用(比如 1 秒内 10 次),所以我认为我应该使用 Threadpool 而不是让后台工作人员来处理这个问题,所以我修改了我的代码,如下所示:

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

这是使用线程池的正确方法吗?如果使用线程这么容易,我觉得我肯定做错了。此代码是否会对我的应用程序造成任何未知的巫术?

4

2 回答 2

2

您的示例是使用线程池的合理开始。如果您唯一感兴趣的只是让代码在您的 UI 线程之外运行,那么它可以很简单。

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

  • MT 版本不保证排队操作将以何种顺序运行
  • MT 版本允许同时运行多个操作,这意味着 SetLogicBreakLine 需要可重入
  • 使用闭包来捕获引用类型的值允许它们的成员在您安排它们之后和它们开始运行之前被突变

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

于 2012-09-03T08:44:13.163 回答
1

如果使用线程这么容易,我觉得我肯定做错了。

您没有做错任何事情,ThreadPool 的全部意义在于使线程的使用更加高效和轻松。我唯一想说的是,如果您需要使用response线程外部,您可能需要重新考虑您的代码。

于 2012-09-03T08:41:53.170 回答