- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
按照MSDN Documentation TaskFactory.StartNew,它创建并启动一个任务。因此,对于以下代码示例
class Program
{
public static void Main()
{
var t =Task.Factory.StartNew(
() => SomeLongRunningCalculation(10, Display)
);
var t1 = Task.Factory.StartNew(
() => SomeLongRunningCalculation(20, Display)
);
Console.WriteLine("Invoked tasks");
Task.WaitAll(t, t1);
Console.ReadLine();
}
public static void Display(int value)
{
Console.WriteLine(value);
}
public static void SomeLongRunningCalculation(int j, Action<int> callBack)
{
Console.WriteLine("Invoking calculation for {0}", j);
System.Threading.Thread.Sleep(1000);
if (callBack != null)
{
callBack(j + 1);
}
}
}
Invoking calculation for 10
Invoking calculation for 20
Invoked tasks
11
21
Invoked tasks
Invoking calculation for 20
Invoking calculation for 10
21
11
最佳答案
在具有单核cpu的计算机上,这很可能会导致结果。或者可能是使用多核cpu的计算机,并且它也在忙于做其他事情。
创建任务或线程仅会建立允许代码运行的逻辑操作系统结构。如果内核繁忙,则操作系统调度程序不会立即开始执行它,线程必须与计算机上运行的所有其他线程竞争。一个典型的Windows session 大约有一千个。内核每秒产生64次中断,调度程序重新评估正在发生的情况,以查看另一个线程是否应该转弯。任何未阻塞的线程(等待其他线程完成作业,例如读取文件或网络数据包)都可以运行,并且调度程序会选择优先级最高的线程。调度程序中的一些其他代码会修改优先级值,以确保所有线程都有机会。
机会是这里的关键词。线程调度是不确定的。
请注意,我从没说过有关Thread或Task或ThreadPool类的事情。他们无权对操作系统调度线程的方式做很多事情。可能的一切是防止线程运行,即线程池调度程序的工作。
优先级很重要,您可以修改Thread.Priority或Task.Priority属性以影响结果。但是,请注意,操作系统调度程序会根据您使用该属性设置的基本优先级不断调整线程优先级。例如,您不能通过拥有另一个优先级更高的线程来阻止线程运行。
希望线程以可预测的顺序运行会导致最严重的错误,即线程竞赛错误。第二大僵局是僵局。它们非常难以调试,因为它们取决于时间以及可用的计算机资源和负载。您只能通过编写明确处理该订单的代码来确保获得特定订单。通过使用诸如Mutex或lock关键字之类的线程原语来执行此操作。同样值得注意的是,当您尝试将这样的代码添加到代码段中时,您最终将获得一个不再具有并发性的程序。换句话说,您将最终不再需要Task。线程或任务只有在您负担得起在不可预测的时间运行时才有用。
关于.net - 为什么TaskFactory.StartNew Task没有立即启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10266221/
按照MSDN Documentation TaskFactory.StartNew,它创建并启动一个任务。因此,对于以下代码示例 class Program { public static v
当这段代码运行时,我无法在我的 UI 中移动或做任何事情: var a = txtLot.Text; var b = cmbMcu.SelectedItem.ToString(); var c = c
如果我将使用 TaskFactory.StartNew(MyFunc(), new CancellationToken(), TaskCreationOptions.None, TaskSchedul
至少当我在代码中实现它时,我必须修改 StartNew Task 才能获得相同的行为。在我的 View 中有一个开始按钮。它的 IsEnabled 属性绑定(bind)到 View 模型中的 bool
我什至不假装理解 C# 中的线程,所以我正在寻找关于线程的真正简单的解释 - 更具体地说是 .NET 4 中的 StartNew() 功能。 我使用以下代码以一种即发即弃的方法调用另一个方法。当网页需
我有这个简单的函数,作为一项任务,它只打印数据集的值。我从主函数和索引传递数据集。问题是我只填充了 2 个数据集索引,但是该函数总是向前跳一个,即在最后一次迭代中它想要开始读取索引 2,该索引未初始化
这是我的代码顺序: 我做了很多 task.factory.startnew(()=> myFunction(myObject, httpSessionState)) 我将 System.Web.Ses
我有 2 个线程调用“Task.Factory.StartNew”。假设一个线程 (ThreadA) 比另一个线程 (ThreadB) 稍微领先。 ... 在线程 A 中,稍微提前调用 Task.Ru
我正在尝试重构一些代码以通过并行性实现更高的吞吐量。我进行了所有基础重构,以实现线程安全的极简主义单一调用。我的方法采用多个参数: private Domain ImportDomain(Constr
我正在从一个函数开始一个新任务,但我不希望它在同一个线程上运行。我不关心它在哪个线程上运行,只要它是不同的线程即可(因此 this question 中提供的信息没有帮助)。 我能保证下面的代码在允许
我想找出为什么需要阻止以下内容才能让控制台写入: Task.Factory.StartNew(() => Console.WriteLine("KO"), TaskCreationOptions.Lo
我得到了以下方法,我想传递 dosleep 方法的返回值: static void Main(string[] args) { var t1 = Task.Factory.StartNew((
我正在尝试掌握 .NET 中的多线程编程。 我想在一个 for 循环中创建 100 个任务,每个任务会休眠 1 秒,然后输出创建时使用的 i 和它的托管线程 ID。所有任务完成后,我想输出经过的总时间
我知道 TPL 不一定为并行集中的每个任务创建一个新线程,但它总是至少创建一个线程吗?例如: private void MyFunc() { Task.Factory.StartNew(()
我正在使用 Task.Factory.StartNew 使长时间的处理服务调用脱离 UI 线程。但是,我在加载应用程序后立即收到以下异常, 通过等待任务或访问其 Exception 属性未观察到任务的
我是 C# 并发的新手,正在尝试使用两个按钮的基本应用程序,第一个按钮单击应该触发一个通过 for 循环的方法,下一个按钮单击甚至应该取消 Task t; CancellationTokenSourc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
给定以下代码: string injectedString = "Read string out of HttpContext"; Task.Factory.StartNew(() => {
据我所知,我有误导性信息。我需要在后台运行一个单独的线程。 目前我是这样做的: var task = Task.Factory.StartNew (CheckFiles
一个简单的问题。这是 WinForms 应用程序的一部分: void Form1_Load(object sender, EventArgs e) { var task2 = Task.Fac
我是一名优秀的程序员,十分优秀!