- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
http://msdn.microsoft.com/en-us/library/dd988458.aspx
更新:
所以,让我们讨论这篇文章:http://msdn.microsoft.com/en-us/library/dd997396.aspx
我稍微修改了一下代码:
static void Main()
{
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Factory.StartNew(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
bool moreToDo = true;
Thread.Sleep(5000);
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
Console.WriteLine("exit");
// Clean up here, then...
ct.ThrowIfCancellationRequested();
}
}
}, tokenSource2.Token); // this parameter useless
Console.WriteLine("sleep");
Thread.Sleep(2000);
Console.WriteLine("cancel");
tokenSource2.Cancel();
// Just continue on this thread, or Wait/WaitAll with try-catch:
try
{
task.Wait();
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
{
Console.WriteLine(e.Message + " " + v.Message);
}
}
Console.ReadKey();
}
UPD:好吧,这只会改变 task.IsCanceled
,恕我直言,这是无用的,因为我仍然应该手动实现所有内容。
最佳答案
由于评论,我发布了另一个答案。
考虑以下代码:
var tokenSource = new CancellationTokenSource();
CancellationToken ct = tokenSource.Token;
tokenSource.Cancel();
var task = Task.Factory.StartNew(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
// do some processing
});
即使调用 tokenSource.Cancel()
是在任务实际开始之前发出的,您仍然会从线程池中分配一个工作线程,因此您会浪费一些系统资源。
但是当您在 Task.Factory.StartNew
中指定 token 参数时,任务将立即取消,而不分配工作线程。
关于c# - TaskFactory.StartNew() 中的 "cancellationToken"有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689765/
按照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
我是一名优秀的程序员,十分优秀!