Tag: task parallel library

TPL数据流:有限容量并等待完成

下面我为了简单起见将一个真实场景复制为LINQPad脚本: var total = 1 * 1000 * 1000; var cts = new CancellationTokenSource(); var threads = Environment.ProcessorCount; int capacity = 10; var edbOptions = new ExecutionDataflowBlockOptions{BoundedCapacity = capacity, CancellationToken = cts.Token, MaxDegreeOfParallelism = threads}; var dbOptions = new DataflowBlockOptions {BoundedCapacity = capacity, CancellationToken = cts.Token}; var gdbOptions = new GroupingDataflowBlockOptions {BoundedCapacity = capacity, CancellationToken […]

AsParallel的最大并行度()

使用Parallel.ForEach我们可以选择定义Parallel选项并设置Max Degree of Parallelism,如: Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > { // Do Work }) 但在做PLINQ时: Tabel.AsEnumberable() .AsParallel() .Where(//Logic) 我无法找到设置MaxDegreeOfParallelism 。 我也在网上抬头,但没有找到任何东西。 有没有人找到解决这个问题的方法? 任何帮助表示赞赏。

如何构建一个任务而不启动它?

我想使用这个Task 构造函数 。 我似乎无法得到正确的sntax可以有人纠正我的代码。 另外,我是否正确地认为如果以这种方式构建任务,它是不是已经开始了? 我认为我需要的构造函数: Task(Func, Object) 我的代码错误: 参数1:无法从’方法组’转换为’ System.Func ‘ static void Main(string[] args) { var t = new Task(GetIntAsync, “3”); //error is on this line … } static async Task GetIntAsync(string callerThreadId) { … return someInt; }

在与前一个相同的线程中继续执行任务

我有一个WebService,可以创建任务和继续任务。 在第一个任务中我们设置Thread.CurrentPrincipal 因此,当ContinuationTask启动时,它不再具有Thread.CurrentPrincipal。 我想在ContinuationTask中指定它应该在与其前提相同的线程中运行 。 我搜索过网络,但我只发现线程要在SynchronizationContext中运行,因此我开始认为我缺少一些基本规则,特别是关于Thread.Principal应该如何工作。

从ASMX调用基于任务的方法

我有一个最近的经验,我想分享这可能对任何必须维护必须更新以调用基于任务的方法的旧ASMX Web服务的人有所帮助。 我最近一直在更新一个ASP.NET 2.0项目,其中包括一个传统的ASMX Web服务到ASP.NET 4.5。 作为更新的一部分,我介绍了一个Web API接口,以允许应用程序的高级自动化。 ASMX服务必须与新API共存才能实现向后兼容。 该应用程序的一个function是能够代表呼叫者从外部数据源(工业工厂历史记录,定制Web服务等)请求数据。 作为升级的一部分,我重新编写了数据访问层的大部分内容,以使用基于任务的异步模式异步请求数据。 鉴于在ASMX服务中不可能使用aync / await,我修改了ASMX方法以对异步方法进行阻塞调用,即调用基于任务的方法,然后使用Task.WaitAll阻塞线程,直到任务完成。 当调用任何正在调用返回任务或任务的方法的ASMX方法时,我发现请求总是超时。 当我逐步完成代码时,我可以看到异步代码已成功执行,但对Task.WaitAll的调用从未检测到任务已完成。 这引起了一个令人头疼的问题:ASMX服务如何能够与新的异步数据访问function共存?

任务取消和TaskContinuationOptions

昨天我刚刚介绍了Tasks(TPL),所以我尝试做一些示例项目,以便了解如何使用它们。 我的示例项目设置了一个开始按钮,开始递增进度条。 第二个按钮取消任务。 用于报告何时调用使用TaskContinuationOptions.OnlyOnRanToCompletion的延续的文本框,以及用于报告何时调用使用TaskContinuationOptions.OnlyOnCanceled的继续的文本框。 我可以创建并执行一个Task,但是以一种让TaskContinuationOptions.OnlyOnCanceled标志继续触发的方式取消它是一个问题。 我按如下方式创建任务: private void StartTask() { CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken token = tokenSource.Token; Task task = null; task = Task.Factory.StartNew(() => DoWork(tokenSource), tokenSource.Token); //A list so that I can cancel the task when clicking a button on the UI Thread. MyTasks.Add(tokenSource); Task completed = task.ContinueWith(result => TaskCompleted(), TaskContinuationOptions.OnlyOnRanToCompletion); Task […]

如何使SqlDataReader.ReadAsync()异步运行?

当调用SQL Server实际执行需要花费时间的事情时, SqlDataReader.ReadAsync()为我同步运行。 有没有办法强制它以异步方式运行,或者是我在Task.Run()调用它的唯一选择? 这是一个复制品。 它使用winforms来certificate该调用阻止了GUI线程。 请注意,T-SQL必须实际执行某些操作 – 使用WAITFOR DELAY ’00:00:20’无法重现 。 using System; using System.Configuration; using System.Data.Common; using System.Data.SqlClient; using System.Threading.Tasks; using System.Windows.Forms; static class SqlDataReaderReadAsyncProgram { static async void Form_Shown(object sender, EventArgs e) { var form = (Form)sender; // Declare your connection string in app.config like // using (DbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString)) […]

async / await with ConfigureAwait的continueOnCapturedContext参数和SynchronizationContext用于异步延续

我想先把代码放一下,然后解释一下情况并根据这个问题提出我的问题: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private async void Button_Click_2(object sender, RoutedEventArgs e) { var result = await GetValuesAsync(); Foo.Text += result; } public async Task GetValuesAsync() { using (var httpClient = new HttpClient()) { var response = await httpClient .GetAsync(“http://www.google.com”) .ConfigureAwait(continueOnCapturedContext: false); // This is the continuation […]

如何获取当前任务参考?

如何引用我的代码在其中执行的任务? ISomeInterface impl = new SomeImplementation(); Task.Factory.StartNew(() => impl.MethodFromSomeInterface(), new MyState()); … void MethodFromSomeInterface() { Task currentTask = Task.GetCurrentTask(); // No such method? MyState state = (MyState) currentTask.AsyncState(); } 因为我正在调用一些接口方法,所以我不能只将新创建的任务作为附加参数传递。

任务LongRunning副作用?

如果使用LongRunning选项创建任务,则会产生任何副作用,因为它们不使用ThreadPool