Tag: 并行处理

等待QueueUserWorkItem完成

如果我使用QueueUserWorkItem向线程池添加作业…如何在完成所有作业之前使程序继续运行? 我知道我可以添加一些逻辑来保持应用程序不运行直到所有作业都完成,但我想知道是否有类似Thread.Join()或者是否有任何方法来检索正在分配作业的每个线程。

并行运行异步方法8次

如何将以下内容转换为Parallel.ForEach? public async void getThreadContents(String[] threads) { HttpClient client = new HttpClient(); List usernames = new List(); int i = 0; foreach (String url in threads) { i++; progressLabel.Text = “Scanning thread ” + i.ToString() + “/” + threads.Count(); HttpResponseMessage response = await client.GetAsync(url); String content = await response.Content.ReadAsStringAsync(); String user; Predicate userPredicate; foreach (Match […]

.net Core Parallel.ForEach问题

我已经切换到.net Core进行了一些项目,现在我遇到了Parallel.ForEach的问题。 在过去,我经常有一个id值列表,然后我会用它来发送Web请求以获取完整数据。 它看起来像这样: Parallel.ForEach(myList, l => { // make web request using l.id // process the data somehow }); 好吧,在.net Core中,Web请求必须全部被标记为await ,这意味着必须使用async标记Parallel.ForEach操作。 但是,将Parallel.ForEach操作标记为async意味着我们有一个void async方法会导致问题。 在我的特殊情况下,这意味着响应在并行循环中的所有Web请求完成之前返回到应用程序,这既尴尬又导致错误。 问题:在这里使用Parallel.ForEach有哪些替代方案? 我发现一个可能的解决方案是将Parallel循环包装在Task中并等待任务: await Task.Run(() => Parallel.ForEach(myList, l => { // stuff here })); (在这里找到: Parallel.ForEach vs Task.Run和Task.WhenAll ) 但是,这对我不起作用。 当我使用它时,我仍然在循环完成之前返回应用程序。 另外一个选项: var tasks = new List(); foreach (var l […]

这是使用Parallel.ForEach()线程安全吗?

基本上,我正在使用这个: var data = input.AsParallel(); List output = new List(); Parallel.ForEach(data, line => { String outputLine = “”; // ** Do something with “line” and store result in “outputLine” ** // Additionally, there are some this.Invoke statements for updating UI output.Add(outputLine); }); 输入是List对象。 ForEach()语句对每个值执行一些处理,更新UI,并将结果添加到output List 。 这有什么本质上的错误吗? 笔记: 输出顺序并不重要 更新: 根据我得到的反馈,我在output.Add语句以及UI更新代码中添加了手动lock 。

为什么并行版本比本例中的顺序版本慢?

我在过去几天一直在学习关于并行性的知识,我遇到了这个例子。 我把它与顺序for循环并排放在一起,如下所示: private static void NoParallelTest() { int[] nums = Enumerable.Range(0, 1000000).ToArray(); long total = 0; var watch = Stopwatch.StartNew(); for (int i = 0; i < nums.Length; i++) { total += nums[i]; } Console.WriteLine("NoParallel"); Console.WriteLine(watch.ElapsedMilliseconds); Console.WriteLine("The total is {0}", total); } 我惊讶地发现NoParallel方法的完成速度比网站上给出的并行示例快得多。 我有一台i5 PC。 我真的认为Parallel方法会更快完成。 对此有合理的解释吗? 也许我误会了什么?

线程安全类应该在其构造函数的末尾有一个内存屏障吗?

在实现一个用于线程安全的类时,我是否应该在其构造函数的末尾包含一个内存屏障,以确保在访问它们之前已完成任何内部结构的初始化? 或者消费者有责任在将实例提供给其他线程之前插入内存屏障吗? 简化问题 : 由于初始化和线程安全类的访问之间缺乏内存屏障,下面的代码中是否存在种族风险可能会导致错误行为? 或者线程安全类本身是否应该防止这种情况? ConcurrentQueue queue = null; Parallel.Invoke( () => queue = new ConcurrentQueue(), () => queue?.Enqueue(5)); 请注意,程序可以接受任何内容,如果第二个委托在第一个委托之前执行,则会发生这种情况。 (null条件运算符?.在这里防止NullReferenceException 。)但是,程序抛出IndexOutOfRangeException , NullReferenceException ,多次排队5 ,陷入无限循环或执行任何其他操作都不应该是可接受的。由内部结构的种族危害引起的怪异事物。 详细问题 : 具体来说,假设我正在为队列实现一个简单的线程安全包装器。 (我知道.NET已经提供了ConcurrentQueue ;这只是一个例子。)我可以写: public class ThreadSafeQueue { private readonly Queue _queue; public ThreadSafeQueue() { _queue = new Queue(); // Thread.MemoryBarrier(); // Is this line required? } […]

转向异步套接字并行,不仅仅是在使用TPL的非常密集的应用程序中并发

我正在编写一个使用Socket的应用程序,它将非常密集,然后我真的需要使用我们在大服务器中的每个核心。 我看到问题( 如何使用ThreadPool运行套接字线程并行? )这里在stackoverflow中只有一个答案指向此MSDN示例 。 但我认为它只指向如何使它并发而不是并行 ,这里有人问如何cpu密集是打开一个套接字 ,它看起来非常密集,有人告诉它不帮助TPL TaskFactory.FromAsync vs任务与阻止方法和某人在这里教会如何使用TaskFactory.FromAsync( 是否存在将现有的BeginXXX / EndXXX异步方法包装成异步任务的模式? )。 如何保持套接字操作并行和高性能,如果处理插槽问题,如断开连接,半连接套接字和消息边界是正常异步方式的头疼。 如果将TPL和Task放在一起,如何处理它。

C#结构是否安全?

C#struct是否是线程安全的? 例如,如果有: struct Data { int _number; public int Number { get { return _number; } set { _number = value; } } public Data(int number) { _number = number; } } 在另一种类型: class DadData { public Data TheData { get; set; } } 是名为TheData的属性,线程安全吗?

在parallel.foreach范围之外增加计数值

如何在parallel.foreach循环范围之外增加一个整数值? 什么是同步访问并行循环外对象的最轻的方法? var count = 0; Parallel.ForEach(collection, item => { action(item); // increment count?? }

如何依靠I / O大量正确地并行工作

我正在构建一个必须处理大量数据的控制台应用程序。 基本上,应用程序从数据库中获取引用。 对于每个引用,解析文件的内容并进行一些更改。 这些文件是HTML文件,并且该过程正在使用RegEx替换进行繁重的工作(查找引用并将它们转换为链接)。 然后将结果存储在文件系统中并发送到外部系统。 如果我按顺序恢复该过程: var refs = GetReferencesFromDB(); // ~5000 Datarow returned foreach(var ref in refs) { var filePath = GetFilePath(ref); // This method looks up in a previously loaded file list var html = File.ReadAllText(filePath); // Read html locally, or from a network drive var convertedHtml = ParseHtml(html); File.WriteAllText(destinationFilePath); // Copy the […]