【发布时间】: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