Tag: task parallel library

异步方法是否正确? Resharper警告

在我的方法RecalcChartAsync我做一些时间密集的东西..所以我想我会做一些事情异步。 我想启动两个方法CreateHistogramAsync CalculatePropValuesAsync ,同时在我的RecalcChartsAsync做一些事情,最后等待它完成。 private async void RecalcChartsAsync() { var histogram = CreateHistogramAsync(); var propValues = CalculatePropValuesAsync(); //do some other stuff await histogram; await propValues; } private async Task CreateHistogramAsync() { //do some stuff } private async Task CalculatePropValuesAsync() { //do some stuff } 我不确定我是否采用正确的方式,因为ReSharper在CreateHistogramAsync和CalculatePropValueAsync的异步关键字上给出了以下警告: 这种异步方法缺少’await’运算符并将同步运行。 考虑使用await运算符等待非阻塞API调用,… 现在我不确定我是否以正确的方式使用这个异步的东西。

是否有“单项大小的异步任务缓冲区”这样的同步工具?

很多时候在UI开发中我处理事件的方式是当事件第一次出现时 – 我立即开始处理,但如果有一个处理操作正在进行中 – 我等待它完成,然后再处理另一个事件。 如果在操作完成之前发生多个事件 – 我只处理最近的事件。 我通常这样做的方式我的进程方法有一个循环,在我的事件处理程序中,我检查一个字段,指示我当前是否正在处理某些事情,如果我 – 我把我当前的事件参数放在另一个基本上是一个项目大小的字段中缓冲区和当前处理过程完成时 – 我检查是否有其他事件要处理,我循环直到我完成。 现在这似乎有点过于重复,可能不是最优雅的方式,虽然它似乎对我来说工作正常。 那我有两个问题: 我需要做的是否有名字? 是否有一些可重复使用的同步类型可以为我做到这一点? 我正在考虑在我的工具包中添加一些由Stephen Toub提供的异步协调原语。

是CancellationTokenSource.CancelAfter()是否泄漏?

Async Targeting Pack的发布促使我使用ILSpy来了解那里提供了哪些基于任务的异步模式(TAP)扩展方法(其中一些我自己已经实现了在VS2010中使用)。 我偶然发现了.CancelAfter(TimeSpan)方法(这是.NET 4.0异步目标包中的扩展方法,但是是.NET 4.5中的实例方法),并认为这可能是实现超时的好方法对于本机没有超时但支持取消的各种操作。 但是查看Async Targeting Pack中的实现,似乎如果关联的Task完成或被取消,则计时器将继续运行。 /// Cancels the after the specified duration. /// The CancellationTokenSource. /// The due time in milliseconds for the source to be canceled. public static void CancelAfter(this CancellationTokenSource source, int dueTime) { if (source == null) { throw new NullReferenceException(); } if (dueTime < -1) { throw […]

Task.Factory.StartNew在部署时不执行任务

我在这里有一些代码,当我在我自己的计算机上安装它/在Windows 7上运行它时可以正常工作,但是当我在其他服务器(2003和2008)上运行它时却没有。 代码来自我在Windows服务中使用的.NET4 WCF服务库。 这是简单的。 public void monitorQueueAndDoStuff() { MonitorRetryQueue(); MonitorMainQueue(); } private void MonitorMainQueue() { Log.Info(“MonitorMainQueue called”); Task.Factory.StartNew(() => { Log.Info(“new thread monitoring queue”); // …NMS stuff while (!stopped) { ITextMessage mess = null; mess = blockingMessageCollection.Take(); sendToQueue(mess); } } } }); } private void MonitorRetryQueue() { Task.Factory.StartNew(() => { //…NMS stuff consumer.Listener += […]

ThrowIfCancellationRequested似乎没有抛出任何exception

我有以下代码: CancellationTokenSource cts = new CancellationTokenSource(); ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; Task.Factory.StartNew(() => { if (Console.ReadKey().KeyChar == ‘c’) cts.Cancel(); Console.WriteLine(“press any key to exit”); }); Parallel.ForEach(list, po, (algo) => { algo.Compute(); // this compute lasts 1 minute Console.WriteLine(“this job is finished”); po.CancellationToken.ThrowIfCancellationRequested(); }); 该list包含很少的元素。 当我按’c’时,所有的Compute方法都已经启动了。 当我按’c’时,不会抛出任何exception。 每个Compute方法都会继续执行,直到正常结束。 当我按’c’时,我想停止/杀死所有剩余的Compute方法。

用于处理c#中文件的multithreading任务

我一直在阅读很多关于线程的内容,但无法弄清楚如何找到我的问题的解决方案。 首先让我介绍一下这个问题。 我有需要处理的文件。 主机名和文件路径位于两个arrays中。 现在我想设置几个线程来处理文件。 要创建的线程数基于三个因素: A)最大线程数不能超过所有方案中唯一主机名的数量。 B) 必须按顺序处理具有相同主机名的文件。 IE我们无法同时处理host1 _file1和host1 _file2。 (数据完整性将受到威胁,这超出了我的控制范围。 C)用户可以限制可用于处理的线程数。 线程数仍受上述条件A的限制。 这纯粹是因为如果我们有大量的主机让我们说50 ..我们可能不希望同时处理50个线程。 在上面的示例中,最多可以创建6个线程。 最佳处理程序如下所示。 public class file_prep_obj { public string[] file_paths; public string[] hostname; public Dictionary my_dictionary; public void get_files() { hostname = new string[]{ “host1”, “host1”, “host1”, “host2”, “host2”, “host3”, “host4″,”host4″,”host5″,”host6” }; file_paths=new string[]{“C:\\host1_file1″,”C:\\host1_file2″,”C:\\host1_file3″,”C:\\host2_file1″,”C:\\host2_file2″,”C:\\host2_file2”, “C:\\host3_file1″,”C:\\host4_file1″,”C:\\host4_file2″,”C:\\host5_file1″,”C:\\host6_file1”}; //The dictionary provides a […]

用于目录遍历的任务并行库

我想遍历我的硬盘上的目录,并在所有文件中搜索特定的搜索字符串。 这听起来像是可以(或应该)并行完成的完美候选者,因为IO相当慢。 传统上,我会编写一个递归函数来查找和处理当前目录中的所有文件,然后递归到该目录中的所有目录。 我想知道如何将其修改为更平行。 起初我简单地修改了: foreach (string directory in directories) { … } 至 Parallel.ForEach(directories, (directory) => { … }) 但是我觉得这可能会创建太多任务并使自己陷入困境,尤其是在尝试重新分配到UI线程时。 我也觉得任务的数量是不可预测的,这可能不是一个有效的平行(这是一个词?)这个任务的方法。 以前有没有人成功完成过这样的事情? 这样做有什么建议?

为什么async / await在我的ASP.net 5控制台应用程序中不起作用?

我在Windows(.NET 4.5.1)和Linux(Mono 4.0.1)上尝试了这个简单的ASP.net 5控制台应用程序,两次都有相同的结果。 注意:我称之为ASP.net 5控制台应用程序,因为这是在Visual Studio中调用到RC的内容。 现在它被称为控制台应用程序(包),但它仍然使用来自https://github.com/aspnet/dnx的 DNX 🙂 我的Program.cs : using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public async void Main(String[] args) { #if DNX451 AppDomain.CurrentDomain.UnhandledException += (s, e) => Console.WriteLine(e); #endif try { await Task.Delay(1000); Console.WriteLine(“After Task.Delay”); } finally { Console.WriteLine(“Inside Finally”); } } } } 我的project.json : […]

为什么异步函数被调用两次?

我正在使用线程计时器来做一些定期工作: private static async void TimerCallback(object state) { if (Interlocked.CompareExchange(ref currentlyRunningTasksCount, 1, 0) != 0) { return; } var tasksRead = Enumerable.Range(3, 35).Select(i => ReadSensorsAsync(i)); await Task.WhenAll(tasksRead); var tasksRecord = tasksRead.Where(x => x.Result != null).Select(x => RecordReadingAsync(x.Result)); await Task.WhenAll(tasksRecord); Interlocked.Decrement(ref currentlyRunningTasksCount); } 我做了定时器回调async并使用了WhenAll 。 在每个工作异步function中,我有一个控制台输出,显示活动。 现在的问题是,在第二个定时器事件中,每个异步函数由于某种原因正在工作两次。 计时器设置为长时间。 该应用程序是Windows控制台类型。 是Select以某种方式让它运行两次?

取消.Net 4.0中的任务延迟

我目前正在尝试在必须以.Net 4.0为目标的程序中实现.Net 4.5的Task.Delay()方法的替代品。 我在这个博客上找到了以下代码。 /* You can write Task-based asynchronous methods by utilizing a TaskCompletionSource. A TaskCompletionSource gives you a ‘slave’ Task that you can manually signal. Calling SetResult() signals the task as complete, and any continuations kick off. */ void Main() { for (int i = 0; i “Done”.Dump()); } } Task Delay (int […]