- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我什至不假装理解 C# 中的线程,所以我正在寻找关于线程的真正简单的解释 - 更具体地说是 .NET 4 中的 StartNew() 功能。
我使用以下代码以一种即发即弃的方法调用另一个方法。当网页需要启动一个耗时的过程,但页面并不真正需要等待结果时,我可能会这样做。据我了解,DoSomething() 方法将“异步”运行。
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
DoSomething();
});
上面的代码似乎按照我想要的方式工作 - 尽管我偷偷怀疑我并没有真正将它用于预期目的。我也曾在 DoSomething() 方法运行之前关闭的控制台应用程序中使用它。我不确定为什么它适用于网页但不适用于控制台应用程序 - 我假设是因为即使页面已卸载,应用程序池仍在继续运行。
真正让我感到困惑的是,我见过很多这样的代码以 .Wait() 结尾的例子。据我了解, .Wait() 意味着此页面上的其余代码将等到 DoSomething() 方法运行......在这种情况下 - 在我有限的理解中 - 这似乎否定了使用的任何好处首先是 StartNew()?
我希望有人能以我简单的小头脑能够理解的方式帮助解释这一点!也许您还可以解释一种更好的调用方法的方法,即用即弃方法?非常感谢!
最佳答案
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
DoSomething();
})
这实际上会将工作卸载到 ThreadPool 上。 ThreadPool
线程一旦可用(这意味着,如果 ThreadPool 已满,它实际上可以在不同的时间执行)。
通过在最后调用 .Wait()
,这将阻塞直到该任务完成执行。本质上,它不会让主线程运行直到它完成,并可能导致性能问题,具体取决于 DoSomething()
执行所需的时间。
更好的方法是使用 async/await
,这样您的应用程序就可以在不占用主 Thread
的情况下继续响应。
另请注意,您应该使用 Task.Run
而不是 StartNew
。除非您需要提供其他参数(例如取消 token 、计划等),否则 Task.Run
是默认用法。
例如:
// fire and forget, this will run on a thread once one is available on the thread pool
Task.Run(()=>
{
DoSomething();
});
// fire and wait until exeuction has finished. this will block all activity until it is done
Task.Run(()=>
{
DoSomething();
}).Wait();
// fire and and wait until the task is completed but do not block the current thread.
private async void DoSomethingAsync()
{
await Task.Run(()=>
{
DoSomething();
});
// perform work after
}
注意:正如 VMAtm 指出的那样,“在 ASP.NET 应用程序中启动任务可能很危险,因为它可能会被 IIS 本身用线程挂起”。
为什么危险?
如何在 ASP.NET 应用程序上运行任务:http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
关于c# - 线程 .StartNew() 和 .Wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781491/
按照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
我是一名优秀的程序员,十分优秀!