Tag: multithreading

TPL可以在多个线程上运行任务吗?

Mono / Xamarin特定的答案受到欢迎。 我正在使用Task.Run()运行System.Threading.Tasks。 TPL是否会在任务执行期间将创建的任务分配给单个线程? 或者创建的任务是否可能在运行时被抢占,然后再次在另一个线程上安排? Thread.CurrentThread.ManagedThreadId会在任务的生命周期内保持不变吗? 对于长期运行的任务,答案是否不同? 有没有办法控制这方面的TPL行为?

FileStream的同步要求。(开始/结束)(读/写)

.Net FileStream是否可以接受以下multithreading调用模式? 几个线程调用这样的方法: ulong offset = whatever; // different for each thread byte[] buffer = new byte[8192]; object state = someState; // unique for each call, hence also for each thread lock(theFile) { theFile.Seek(whatever, SeekOrigin.Begin); IAsyncResult result = theFile.BeginRead(buffer, 0, 8192, AcceptResults, state); } if(result.CompletedSynchronously) { // is it required for us to call AcceptResults […]

为什么ReSharper认为“thread.Name == null”总是假的?

我正在编写一个帮助方法来方便地设置一个Thread的Name : public static bool TrySetName(this Thread thread, string name) { try { if (thread.Name == null) { thread.Name = name; return true; } return false; } catch (InvalidOperationException) { return false; } } 它按预期工作。 然而,ReSharper声称条件总是错误的,相应的代码是启发式无法访问的。 那是错的。 在分配字符串之前, Thread.Name始终为null。 那么,为什么ReSharper认为它是? 有没有办法告诉ReSharper它不是(除了// ReSharper disable … )? 我正在使用ReSharper 5.1.3。

C#中的DoEvents()实际上做了什么?

我们聘请了一家公司将一个控制某些工业机械的旧VB6 DLL转换为C#。 旧的VB6代码具有“暂停”例程,由睡眠调用和DoEvents组成,因此在hibernate时,DLL中的计时器和套接字事件仍将被处理。 DoEvents转换为 System.Windows.Forms.Application.DoEvents(); 我不是VB6程序员,但我的理解是VB6实际上是单线程的,因此长时间hibernate会关闭所有内容,包括计时器和套接字事件处理。 当代码转换为C#时,暂停例程看起来像这样。 。 。 public static void pauseit_ms(ref int milliseconds) { try { Sleep(milliseconds / 2); System.Windows.Forms.Application.DoEvents(); Sleep(milliseconds / 2); } catch (Exception exc) { LogException(“pauseit_ms”, exc); } } 在.Net中,计时器和套接字事件在它们自己的线程中运行(我在这个转换后的代码中的大部分工作都是试图使它成为线程安全的!)所以DoEvents()购买我们并不明显。 但是MSDN说 调用此方法会导致在处理所有等待窗口消息时挂起当前线程。 那么我们应该将这些DoEvents()保留在其他类型的事件(不是定时器或套接字回调)中吗? 或者它们在.Net / C#上下文中是多余的?

为什么Task的Result属性不可用于非generics任务(C#4.0+)?

我试图掌握.NET 4.0+任务并行库概念…… 在以下C#4.0代码段中: Task t = Task.Factory.StartNew(() => { Console.WriteLine(“I am the task”); return “res1”; }); 为什么编译器没有(和运行时)如果不能使用返回产生任何错误,除非使用通用任务: Task t = Task.Factory.StartNew(() => { Console.WriteLine(“I am the task”); return “res1”; }); 或者它(返回的对象)可以使用? 我是否正确理解,只有在检测或确保返回类型(ed对象)或t.Result时才需要Task 中的Task ? 或者除了这个之外还有其他隐藏的必需品吗? 为什么这种类型不能从返回对象的类型中确定? 也就是为什么任务的Result属性不可用于非通用任务?

C#返回ConcurrentBag的副本

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.Concurrent; namespace Crystal_Message { class Message { private int messageID; private string message; private ConcurrentBag messageFor; private Person messageFrom; private string calltype; public Message(int iden,string message, Person messageFrom, string calltype, string telephone) { this.messageID = iden; this.messageFor = new ConcurrentBag(); this.Note = message; this.MessageFrom […]

Task.StartNew()vs Parallel.ForEach:多个Web请求场景

我已经阅读了SO中的所有相关问题,但对于我的场景中触发多个Web服务调用的最佳方法有点困惑。 我有一个聚合器服务,它接受输入,解析并将其转换为多个Web请求,进行Web请求调用(不相关,因此可以并行触发)并合并发送回调用者的响应。 现在使用以下代码 – list.ForEach((object obj) => { tasks.Add(Task.Factory.StartNew((object state) => { this.ProcessRequest(obj); }, obj, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default)); }); await Task.WhenAll(tasks); await Task.WhenAll(tasks)来自Scott Hanselman的post ,据说 斯蒂芬说:“从可扩展性的角度来看,更好的解决方案是利用异步I / O.当你通过网络呼叫时,没有理由(除了方便之外)在等待响应来阻止线程时背部” 现有代码似乎消耗了太multithreading,并且处理器时间在生产负载上达到100%,这让我思考。 另一个替代是使用Parallel.ForEach,它使用分区器,但也“阻塞”调用,这对我的场景来说很好。 考虑到这是所有“异步IO”工作而不是“CPU绑定”工作,并且Web请求不会长时间运行(最多返回3秒),我倾向于认为现有代码足够好。 但这会提供比Parallel.ForEach更好的吞吐量吗? Parallel.ForEach可能使用“最小”数量的任务,因为分区因此最佳使用线程(?)。 我用一些本地测试测试了Parallel.ForEach,但似乎没有更好。 目标是减少CPU时间并提高吞吐量,从而提高可扩展性。 是否有更好的方法来并行处理Web请求? 感谢任何投入。 编辑:代码示例中显示的ProcessRequest方法确实使用HttpClient及其异步方法来触发请求(PostAsync,GetAsync,PutAsync)。

返工EventWaitHandle以异步等待信号

当调用EventWaitHandle.WaitOne时,我需要将当前代码更改为不阻止当前线程。 问题是我正在等待全系统事件。 我还没有找到任何适当的替代品。 码: EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset, “Local event”, out screenLoadedSignalMutexWasCreated); StartOtherApp(); if (screenLoadedSignalMutexWasCreated) { isOtherAppFullyLoaded = handle.WaitOne(45000, true); if (isOtherAppFullyLoaded ) { // do stuff } else { // do stuff } handle.Dispose(); signalingCompleted = true; } else { isOtherAppFullyLoaded = false; throw new Exception(” “); } 我需要应用程序继续而不是停在我称之为WaitOne的行上,理想情况下会有等待。 我该如何实现呢?

Thread.Join方法在c#中有什么意义?

Thread.Join方法在c#中有什么意义? MSDN表示它会阻塞调用线程,直到线程终止。 有人可以用一个简单的例子来解释这个吗?

减慢创建具有许multithreading的对象

我正在做一个产生数百个线程的项目。 所有这些线程都处于“hibernate”状态(它们被锁定在Monitor对象上)。 我注意到,如果我增加“hibernate”线程的数量,程序会非常慢。 “有趣”的是,看着任务管理器似乎线程数越多,处理器就越自由。 我已将问题缩小到对象创建。 有人可以向我解释一下吗? 我制作了一个小样本来测试它。 这是一个控制台程序。 它为每个处理器创建一个线程,并通过简单的测试(“新对象()”)测量它的速度。 不,“新的对象()”没有被淘汰(如果你不信任我,试试)。 主线程显示每个线程的速度。 按CTRL-C,该程序产生50个“睡眠”线程。 减速开始只有50个线程。 在任务管理器中,大约250个非常明显,CPU不是100%使用的(我的是82%)。 我已经尝试了三种锁定“hibernate”线程的方法:Thread.CurrentThread.Suspend()(坏,坏,我知道:-)),锁定已经锁定的对象和Thread.Sleep(Timeout.Infinite)。 一样的。 如果我使用新的Object()注释该行,并将其替换为Math.Sqrt(或没有任何内容),则问题不存在。 速度不随线程数而变化。 别人可以查一下吗? 有谁知道瓶颈在哪里? 啊……你应该在发布模式下测试它,不要从Visual Studio中启动它。 我在双处理器上使用XP sp3(没有HT)。 我用.NET 3.5和4.0测试了它(测试不同的框架运行时) namespace TestSpeed { using System; using System.Collections.Generic; using System.Threading; class Program { private const long ticksInSec = 10000000; private const long ticksInMs = ticksInSec / 1000; private const int […]