【问题标题】:How can I start class in a separate thread?如何在单独的线程中开始上课?
【发布时间】:2014-06-29 23:06:12
【问题描述】:

我想知道。如何在单独的线程中开始上课?我想在单独的线程中处理外部事件。我怎么能做到这一点。我尝试使用无限循环,但没有帮助。

public class Class1
{
    public void Run()
    {
        Task.Factory.StartNew(() =>
            {
                while (true)
                {

                }
            }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    }

    public void Show()
    {
        Console.WriteLine(AppDomain.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture));
    }

当我在控制台打印的主流 ID 中调用 Show() 方法时。

【问题讨论】:

  • 启动一个类,就像创建一个实例一样?
  • 是的,例如。我想做这样的事情。 Task.Run (() => new Class1());并且该类存在于应用程序的生命周期中。
  • 然后在你的 Run 方法中使用Task.Run (() => new Class1().Run()); 并调用Show
  • 要拥有一个在应用程序的整个生命周期中都存在的实例,您应该将其作为静态初始化字段或在 Main 开头声明它。任务用于异步编程,而不是作为一些随处使用的工具。如果您想在应用程序的生命周期内连续执行某些作业,您应该使用一些后台线程,因为 TPL 旨在支持 run-the-task-get-the-result 模型,而不是 run-the-service-use-it型号
  • @Eugene 我觉得你有点过火了。他只是想知道如何在不同的线程上运行无限循环。 Task 不仅适用于 async 或运行任务并获取结果,它是对线程池和线程创建的抽象

标签: c# task-parallel-library


【解决方案1】:

您不应在 Run 内显式创建 Task。只需在Run 中创建while(true) 循环并通过Task.Run 调用它

public class Class1
{
    public void Run()
    {
       while (true)
       {
            // Do stuff in loop
       }
    }
}

然后调用它:

Task.Run(() => new Class1().Run(), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

【讨论】:

  • 这是一个非常的坏主意,因为它浪费了一个 ThreadPool 线程。任务(或线程池线程)应该做一件事并完成,而不是无限期地阻塞。循环中的任何内容都应该作为单独的线程运行,而不是循环本身
  • @PanagiotisKanavos 这不是真的。 TaskCreationOptions.LongRunning 标志将强制为此任务分配一个新的专用线程,而不使用ThreadPools 之一。他想在专用线程上创建一种MessageLoop。我看不出有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多