Tag: task parallel library

从任务并行库更新ProgressBar UI对象

基本上我想在FormMain(WindowsForm)上更新ProgressBar UI对象。 我使用的是.NET 4.0 以下是Form1.Designer.cs中的代码 namespace ProgressBarApp { public partial class Form1 : Form { private System.Windows.Forms.ProgressBar curProgressBar; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { CustomProcess theProcess = new CustomProcess(); theProcess.Process(); } } } 这是CustomProcess.cs的定义 namespace ProgressBarApp { class CustomProcess { public void Process() { for (int i = 0; […]

在foreach循环中使用parallel.foreach和task之间的性能差异是什么?

我想知道什么是最好的方法,或者是否有任何文档/文章可以帮助我确定在每个循环的正常情况下使用Parallel.foreach和Task的区别是什么,如下所示: 案例1 – Parallel.foreach: Parallel.foreach { // Do SOmething thread safe: parsing an xml and then save // into a DB Server thry respoitory approach } 案例2 – foreach中的任务: foreach { Task t1 = Task.factory.startNew(()=> { //Do the same thing as case 1 that is thread safe } } Task.waitall() 我确实进行了自己的测试,结果显示案例1的表现优于案例2.比例大致如下:顺序vs案例1 vs案例2 = 5s:1s:4s 虽然案例1和案例2几乎有1:4? […]

是否可以在没有CancellationToken的情况下取消C#任务?

我需要取消返回任务的API调用,但它不会将CancellationToken作为参数,我不能添加一个。 我该如何取消该任务? 在这种特殊情况下,我正在使用带有Geocoder对象的Xamarin.Forms。 IEnumerable positions = await geo.GetPositionsForAddressAsync(address); 这个电话有时需要很长时间。 对于我的一些用例,用户可以只导航到另一个屏幕,并且不再需要该任务的结果。 我还担心我的应用程序会进入hibernate状态,并且没有停止长时间运行的任务,或者任务完成并且需要不再有效的代码。

异步CTP错误 – 任务永远不会完成

首先是道歉:我无法将以下错误隔离到一个简单的控制台应用程序中。 但是,在我相对简单的ASP.NET Web窗体应用程序中,以下代码将导致当前线程无限期地阻塞: public class MyModule : IHttpModule { public void Dispose() { } public void Init(System.Web.HttpApplication context) { context.BeginRequest += this.Context_BeginRequest; } private void Context_BeginRequest(object sender, EventArgs e) { Sleep().Wait(); var x = 2; // This line is never hit. } private async Task Sleep() { await TaskEx.Run(() => System.Threading.Thread.Sleep(1000)); } } 任务状态仍然是’WaitingForActivation’。 有谁知道为什么会这样?

模拟给出不同的结果与正常的环路Vs并行For

当我尝试使用普通for循环(这是正确的结果)时,我对我的一个简单模拟样本的不同结果感到有点惊讶。 请帮我找出原因。 我观察到并行执行与正常相比是如此之快。 using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Simulation { class Program { static void Main(string[] args) { ParalelSimulation(); // result is .757056 NormalSimulation(); // result is .508021 which is correct Console.ReadLine(); } static void ParalelSimulation() { DateTime startTime = DateTime.Now; int trails = 1000000; int numberofpeople = 23; Random rnd = new […]

如何将任务的已取消状态传播到延续任务

我在我的应用程序中使用任务并行库。 我有一个任务(让我们称之为“DoSomething”)可能被取消。 无论任务是故障,取消还是成功完成,我都会继续执行该任务,执行一些清理工作。 在启动此任务的代码中,我想返回一个Task对象,其状态(出错,取消,运行完成)反映了DoSomething任务的状态,但重要的是我返回的这个任务不会反映这个状态,直到继续任务执行。 这是一个例子: public Task Start(CancellationToken token) { var doSomethingTask = Task.Factory.StartNew(DoSomething , token); var continuationTask = doSomethingTask.ContinueWith ( (antecedent) => { if (antecedent.IsFaulted || antecedent.IsCanceled) { //Do failure-specific cleanup } //Do general cleanup without regard to failure or success } ); //TODO: How do I return a Task obj which Status reflect […]

如何实现异步方法及其同步方法?

我有一个方法,如Task GetContentAsync(string url) ,我的控制台应用程序还没有完全准备好在内部利用TPL,但可能在以后它会。 如何轻松地为此(或其他)方法编写同步包装器(不是替代实现)?

在UI线程上创建和启动任务

当一个在工作线程上调用的方法需要在UI线程上运行代码并在执行其他操作之前等待它完成时,可以这样做: public int RunOnUi(Func f) { int res = Application.Current.Dispatcher.Invoke(f); return res; } 但是,如果我想用任务做什么呢? 有没有办法让RunOnUi方法创建一个在UI上启动并返回它的任务,以便调用者(在工作线程上运行)可以等待它? 适合以下签名的东西: public Task StartOnUi(Func f) ? 一种方法如下: public Task RunOnUi(Func f) { var task = new Task(f); task.Start(_scheduler); return task; } 这里,假设_schduler持有ui TaskScheduler 。 但是我不太习惯于创建“冷”任务并使用start方法来运行它们。 这是“推荐”的方式还是有更优雅的方式来做到这一点?

更改C#Parallel.For循环的增量值

我想转换一个for循环,它使用TPL将每次传递的迭代器增加2进入Parallel For循环。 数据不依赖于顺序或以任何方式受约束,但我只想处理源数组的每个其他元素中的数据(在下面的代码中是_Datalist),因此需要增加2。 我的For循环: for (int i = 1; i < _DataList.Length – 1; i += 2) { // Do work for _DataList[i] } 是否有可能告诉并行循环我想要增加2而不是1? 这是并行循环,但显然我每次迭代只增加1: Task.Factory.StartNew(() => Parallel.For(1, _DataList.Length, i => { // do work for _DataList[i] }) ); 我可以告诉内部循环体忽略i的奇数值,但这看起来很麻烦 – 有没有办法在循环初始化中做某种方式?

有没有办法将TaskCompletionSource驱动的任务设置为Status’Running’?

我正在使用TaskCompletionSource来提供和驱动Task的实例。 我希望能够将Task设置为Running状态以指示任务是“正在运行”但是我无法通过TaskCompletionSource看到实现此TaskCompletionSource 。 有没有办法做到这一点?