【问题标题】:C# Start Thread inside itselfC# 在自身内部启动线程
【发布时间】:2021-06-25 10:07:54
【问题描述】:

我尝试在其内部启动一个正在运行的线程。也许这听起来很奇怪,但这只是为了知道它是否可能。

我的调用函数启动了一个线程,其中包括我的函数。之后,我的函数会查询之前是否插入了特定设备。如果这是真的,一切都很好,并且将与该设备建立连接。 如果设备在软件启动时没有插入,该函数会询问设备现在是否已插入。如果为真,则调用自身,如果为假,则停止。

这是代码,它应该可以工作

public void CallFunction()
{
  Thread CheckDevice = new Thread(new ThreadStart(myFunction));
  CheckDevice.Start();
}
private void myFunction()
{
  if (ConnectionCheck.DevicePluggedIn)
  {
    try
    {
      Device.Connect();
    }catch
    {
      //ErrorMessage
    }
  }
  else
  {
    if (ConnectionCheck.DevicePluggedIn = SearchDevice())
    {
      Thread.CurrentThread.Start();
      return;
    }
    else
    {
      //InfoMessage
    }
  }
}

这可能吗,我这样调用线程还是只调用函数更好。 感谢您的帮助。

【问题讨论】:

  • 这完全没有意义。 ThreadStart 委托中的代码在 Thread 启动之前不会被执行。如前所述,您根本不应该明确使用线程。相反,应专注于任务等现代方法。
  • Thread.CurrentThread.Start(); 似乎毫无意义。如果当前线程没有运行,它如何执行这条语句?
  • 你不需要这样做。只需在 myFunction 中添加一个 while 循环即可。
  • 完美的for/while 循环有什么问题?
  • “这可能吗,我这样称呼线程” - 如果你真的运行你的代码,你会发现你的代码抛出了ThreadStateException跨度>

标签: c# multithreading


【解决方案1】:

只需将您的 myFunction 更改为:

private void myFunction()
{
  bool connected = false;
  while (!connected)
  {
    if (ConnectionCheck.DevicePluggedIn)
    {
      try
      {
        Device.Connect();
        connected = true;
      } catch
      {
        //ErrorMessage
      }
    }
    else
    {
      ConnectionCheck.DevicePluggedIn = SearchDevice())
    }
  }
}

说明:你不能启动一个已经在运行的线程。

只需执行一个 while 循环,直到连接成功。由于它在自己的线程中运行,因此不会影响程序的其余部分。

【讨论】:

  • 当使用这样的循环时,建议有某种超时。因此,在最坏的情况下,while 循环不会永远运行。可以说最后的退出策略
  • 这就是为什么这类问题在 SO 上没有成效。它变成了问题和答案的社区代码审查(这对于 SO 来说是题外话)
  • 是的,你是对的。也可以考虑在循环中使用 Thread.Sleep,以免对 CPU 造成太大压力。
【解决方案2】:

无需调用额外的线程。我认为这就是你想要做的:

private void myFunction()
{
  if (!ConnectionCheck.DevicePluggedIn)
  {
    ConnectionCheck.DevicePluggedIn = SearchDevice()
  }
  if (ConnectionCheck.DevicePluggedIn) {
    try
    {
      Device.Connect();
    }catch
    {
      //ErrorMessage
    }
  }
  else
  {
      //InfoMessage
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多