Tag: 任务

“长期任务”是什么意思?

默认情况下,CLR在池化线程上运行任务,这是短期运行计算绑定工作的理想选择。 对于长时间运行和阻塞操作,可以按如下方式阻止使用池化线程: Task task = Task.Factory.StartNew (() => …, TaskCreationOptions.LongRunning); 我正在阅读有关thread和task主题。 你能解释一下“长[呃] – 跑”和“短跑”的任务是什么?

在TPL中返回一个空的静态任务是一种不好的做法?

有些情况下,我希望有条件地运行任务。 我使用某种类似的扩展方法: public static class MyTaskExtension{ private static Task theEmptyTask = Task.Factory.StartNew(() => {}); //This is the question public static Task ContinueWith(this Task task, Task continuationTask, Func condition) { if condition(){ … do the work } return theEmptyTask; } } 我的期望是,theEmptyTask已经完成,所以基本上如果我不想做任何事情我只返回这个任务,而不是null或一个新的空任务。 我觉得这种方法应该有一些小问题。 有人能看到吗?

Threading.Tasks.Task’不包含’Result’的定义

所以我正在尝试学习如何用Task编程,我正在做练习: public static int ReturnFirstResult(Func[] funcs) { Task[] tasks = new Task[funcs.Length]; for (int i = 0; i < funcs.Length; i++) { tasks[i] = CreatingTask(funcs[i]); } return Task.Factory.ContinueWhenAny(tasks, (firstTask) => { Console.WriteLine(firstTask.Result); return ***????***; }).***Result***; } private static Task CreatingTask(Func func) { return Task.Factory.StartNew(() => { return func.Invoke(); }); } 我正在给一个Funcs数组运行,ideia是返回第一个完成的func的结果。 问题是字段结果不可用… 我在这里失踪了什么?

只需要’最近’的任务 – 取消/忽略的最佳做法?

我有一个看起来像这样的任务: var task = Task.Factory.StartNew (LongMethod); task.ContinueWith(TaskCallback, TaskScheduler.FromCurrentSynchronizationContext()); LongMethod调用一个长期运行的服务,在此期间我不能(或者至少不认为我可以),不断轮询取消令牌以查看它是否已被取消。 但是,我有兴趣’取消’或忽略回调方法。 当调用TaskCallback时,我只对’结果’感兴趣, 如果它来自最近的任务(让我们假设LongMethod调用的服务保留了顺序,并且还假设用户可以多次单击该按钮,但只有最新的一个是相关的)。 我已按以下方式修改了我的代码:创建任务后,我将其添加到堆栈顶部。 在TaskCallback中,我检查传递给回调的任务是否是最新的(即堆栈顶部的TryPeek)。 如果不是,我只是忽略了结果。 private ConcurrentStack _stack = new ConcurrentStack(); private void OnClick(object sender, ItemClickEventArgs e) { var task = Task.Factory.StartNew ( LongMethod); task.ContinueWith(TaskCallback, TaskScheduler.FromCurrentSynchronizationContext()); _stack.Push(task); } private void TaskCallback(Task task) { Task topOfStack; if(_stack.TryPeek(out topOfStack)) //not the most recent { if (task != […]

等待AsyncMethod()与等待等待等待Task.Factory.StartNew (AsyncMethod)

给定以下方法: public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject(); } 是否有区别: public async void SomeEventHandler(EventArgs args) { var myObject = await await Task.Factory.StartNew<Task>( DoSomethingAsync); // do something with myObject } 和: public async void SomeEventHandler(EventArgs args) { var myObject = await DoSomethingAsync(); // do something with myObject } 我认为DoSomethingAsync的“做一些工作”部分会在第一种情况下立即发生在新任务中,但说实话我并不完全理解Task,async和await是如何工作的,而且我很漂亮确定我只是为自己过度复杂的事情。 […]

任务和exception沉默

为什么在任务中抛出的exception是静默exception,你永远不知道是否抛出了某个exception try { Task task = new Task( () => { throw null; } ); task.Start(); } catch { Console.WriteLine(“Exception”); } 程序在完全沉默中成功运行! 线程的行为不同 try { Thread thread = new Thread( () => { throw null; } ); thread .Start(); } catch { Console.WriteLine(“Exception”); } 在这种情况下,将抛出空指针exception。 有什么不同?

我应该注意到在.Net 4.0中使用任务与线程的区别吗?

我更新了我的代码以使用Tasks而不是线程…. 看看内存使用情况和CPU我没有注意到多核PC的任何改进,这是预期的吗? 我的应用程序基本上在运行时启动不同对象中的线程/任务… 我所做的一切都很简单 Task a = new Task(…) a.Start();

使用Task.ContinueWith创建执行队列?

我有几个我想在后台执行的操作,但它们必须一个接一个地同步执行。 我想知道使用Task.ContinueWith方法实现这一点是否是个好主意。 你预见到这有什么问题吗? 我的代码看起来像这样: private object syncRoot =new object(); private Task latestTask; public void EnqueueAction(System.Action action) { lock (syncRoot) { if (latestTask == null) latestTask = Task.Factory.StartNew(action); else latestTask = latestTask.ContinueWith(tsk => action()); } }

Task .Convert 扩展方法是否有用或是否存在隐患?

我正在为Google Cloud API编写客户端库,这些库具有相当常见的异步辅助重载模式: 做一些简短的同步工作来设置请求 发出异步请求 以简单的方式转换结果 目前我们正在使用异步方法,但是: 转换await的结果最终会在优先级方面令人讨厌 – 我们最终需要(await foo.Bar().ConfigureAwait(false)).TransformToBaz()和括号很烦人。 使用两个语句可以提高可读性,但这意味着我们不能使用表达式身体方法。 我们偶尔会忘记ConfigureAwait(false) – 这在某种程度上可以通过工具解决,但它仍然有点嗅觉 Task.ContinueWith听起来好主意,但我读过斯蒂芬克莱里的博客文章推荐反对它,原因似乎是合理的。 我们正在考虑为Task添加一个扩展方法,如下所示: 潜在的延伸方法 public static async Task Convert( this Task task, Func projection) { var result = await task.ConfigureAwait(false); return projection(result); } 然后我们可以非常简单地从同步方法中调用它,例如 public async Task BarAsync() { var fooRequest = BuildFooRequest(); return FooAsync(fooRequest).Convert(foo => new Bar(foo)); } 甚至: public […]

如何取消正在运行的任务?

我想取消正在运行的任务(当用户按下转义键时)。 当我点击“转义”键时,Form_KeyDown运行但不取消任务! CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken token=new CancellationToken(); private async void Search_Button_ClickAsync(object sender, EventArgs e) { token = tokenSource.Token; await (Task.Factory.StartNew(() => { //…my program }, token)); private void Form_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { tokenSource.Cancel(); } }