【问题标题】:Run a new thread immediately [duplicate]立即运行一个新线程[重复]
【发布时间】:2016-11-21 18:40:35
【问题描述】:

我正在使用 C# 和 .NET Framework 4.6.1 以及 SQL Server 2012 SP3 和 Entity Framework 6.1.3 Code First 开发 WPF 应用程序。

我需要立即运行一个线程,但现在它不能立即使用此代码运行:

Task.Run(() =>
{
    RequestNewCodes();
});
private void RequestNewCodes()
{
    log.DebugFormat("Task thread ID: {0} - {1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow.ToString("hh:mm:ss.fff"));

    try
    {
        trazabilidad.InsertNewCodesWeb(1, codesManagerURL);
    }
    catch (Exception ex)
    {
        log.Error(string.Format("InsertNewCodesWeb nivel 1: {0}", ex.ToString()));
    }
}

Task.Run文档说:

将指定的工作排入队列以在线程池上运行并返回一个任务 代表该作品的对象。

但我不想排队。

如何在不使用 ThreadPool 的情况下立即运行线程?

立即意味着不要将任务推送到池中并等待轮到它。

我没有重复使用连接。每次连接到数据库时,我都会创建一个新的 DbContext 并在最后销毁它。

这不是一个重复的问题。我已经测试了该问题的所有答案,但它对我不起作用。我找到了解决这个问题的方法,我想和你分享,但我不能,因为这个问题已经结束了。

【问题讨论】:

  • 使用线程。任务不是线程。 new Thread().Start().
  • 很可能,它会立即运行。如果没有,您的线程池已超载。您如何确定这段代码运行需要多长时间?
  • @usr 因为该代码是一种方法,它被调用了 21 次。该代码使用日期将数据插入数据库,并且在所有其他进程结束后,我检查了它插入的数据 21 次(数据库中有 21 行)。
  • 定义“立即”。一旦您将工作移交给另一个任务/线程,您就无法知道该工作将如何以及何时完成 - 除非您使用显式同步原语,并且您寻求同步的保证越多,您就越有可能应该刚刚完成了原始线程上的工作,并且无论如何都不会将工作转移到其他地方。
  • 当您开始在多个线程上进行处理时,您会在每个部分执行时失去对确切的控制。这几乎是多线程 101...

标签: c# multithreading


【解决方案1】:

最简单的方法就是实例化一个线程

Thread task = new Thread(()=>
{
     try
     {
         ConnectToCodeManager();

         string connectionString = ConfigurationManager.ConnectionStrings["DataBaseConnection"].ConnectionString;

         SQLTrazabilidadStorage storage = new SQLTrazabilidadStorage(connectionString);

         storage.SendAggregation(parentCode, codesManagerURL);
     }
     catch (Exception ex)
     {
         log.Error(string.Format("SendAggregation to TrzCodesManagerWS: {0}", ex.ToString()));
     }
});
task.Start();

【讨论】:

  • 线程池没有问题。启动原始线程不会解决数据访问代码中的并发问题
  • true,但它是一种简单的方法,可以更好地控制它的运行方式和时间。目前还不能说他描述的是并发问题还是 VansFannel 只是想控制动作。
  • 不,你会得到更多的延迟——你必须创建线程,这需要很多时间。 ThreadPool 包含可以立即使用的即用型线程。一个 ThreadPool 可以包含数千个线程,所以如果你真的想要立即响应,只需设置一个最小限制。
  • 数据库的表中没有任何块。可能数据库中没有可用的连接。
  • 并发只在他用来收集数据的对象/函数中解决,而不是在这段代码中。因此,我认为谨慎的做法是展示一种可能的方式来对when操作进行更多控制...线程池不会提供与自己的线程相同的控制。
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多