【问题标题】:Threads C# stop executing program, while not using threads keeps the program running线程 C# 停止执行程序,而不使用线程保持程序运行
【发布时间】:2011-11-03 19:41:04
【问题描述】:

我在 C# 中使用 -first time- threads -with multiparameters-。我遇到的问题是:

如果我使用这些功能 - 我会发布 - 没有威胁,它将遵循程序的自然逻辑。不过,我需要使用线程同时调用函数的多个实例。但是当我使用线程时,程序的执行会停止,尽管我知道线程正在正确调用函数,因为我看到了它 - 它会弹出一个 Windows形式!它会打印一些我输入的消息-

我不知道为什么,是比较简单的功能。我认为它可能与 EventArgs 有关,但不确定-我也将它作为参数传递!-。

让我们看看线程和函数:

 //This is the function that I call in the threads
 public void device(object i, object s, object f)
 {
     int j = (int)i;
     EventArgs g = (EventArgs)f;

      //Connect the devices
      BSSDK.BS_SetDeviceID(m_ConnectedDeviceHandle[j],
          m_ConnectedDeviceID[j], m_ConnectedDeviceType[j]);

      UserManagement userTest = new UserManagement();

      userTest.SetDevice(m_ConnectedDeviceHandle[j],
          m_ConnectedDeviceID[j], m_ConnectedDeviceType[j]);

      //Open a windows form and show the interface!
      userTest.Show();
    }


   // The function with the threads
   private void userTest_Click(object sender, EventArgs e)
   {
        ...

        //This loop if for testing, the actual value will be other.
        for (int i = 0; i < 2; i++)
        {

            //Notice that I´m sending 3 parameters!
            Thread t = new Thread(unused => device(i, sender, e));

            try
            {
                t.Start();
            }
            catch (ThreadStateException f)
            {
                MessageBox.Show("ERROR:" + f);  
            }
         }
       }

谢谢。

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    当线程结束时,您的表单将超出范围。你需要做一些事情来保持对它的引用。

    与来自不同线程的控件交互通常也是一个坏主意。试图从创建它的线程以外的线程访问控件可能会导致跨线程异常。您必须调用 Invoke 或 BeginInvoke 来将调用编组到正确的线程。

    【讨论】:

    • 让线程等待是明智的,所以它不会完成? (我知道这听起来很糟糕)
    • 我不确定你的程序到底想做什么,但这听起来不是一个好主意。最好确保所有控件(包括您的表单)都在主线程上创建,并让控件调用以在其他线程中完成它们的工作,而不是尝试从工作线程内部创建和管理表单.如果您要这样做,最好将.Show 调用更改为.ShowDialog,因为这将阻止线程结束,直到窗口被关闭。我仍然不建议这样做,即使它有效。
    • 好吧,ShowDialog 起作用了。我明白你的意思。我将看看是否可以更改程序的逻辑以在线程中创建表单。但我会一团糟。我的程序连接到 生物识别 设备,我正在尝试同时连接和执行 - 获取指纹 - 许多设备。这就是我尝试使用线程的原因,但此时复杂性很高:/ 感谢您的提示!
    • 您的代码中的哪个位置是您试图移动到另一个线程的长时间运行的进程?是对 BS_SetDeviceID 的调用吗?还是它实际上是由用户从 UserManagement 表单内部调用的?
    • 嗯,我有 2 种形式 - 更多,但对于这个特定的地方是 2-:在 first 我使用 BS_SetDeviceID连接设备> 这是我粘贴的代码。在来自 userTest.Show() (.ShowDialog) 的 second 中,我必须单击一个按钮并激活 生物识别设备。我使用 thread 调用 X 个 userTest.Show() 表单,其中 X 是连接设备的数量。当然,这很难看:我必须以某种方式连接 按钮 以激活 所有这些表单 中的设备,所以我不点击那个按钮 每个形式。我想我在这里搞得一团糟。
    【解决方案2】:

    如果这是您第一次查看线程,我建议您停下来看看其他内容!:) 首先,您在这里尝试做的是新 Async 库 (http://msdn.microsoft.com/en-us/vstudio/gg316360) 的完美候选者。请注意,虽然是 CTP,但 MS 确实支持使用此配置。

    如果您确实需要使用类似于线程提供的东西,您可以使用任务并行库。您可以将任务视为轻量级线程。

    今天我会使用线程的唯一情况是当我有一个需要完全控制的长时间运行的操作时。

    最好的问候,

    提比

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2013-11-21
      • 2017-06-19
      相关资源
      最近更新 更多