Tag: multithreading

C#如何检测对象已被锁定

如何检测对象是否被锁定? Monitor.TryEnter (如有没有办法检测对象是否被锁定? )对我不起作用,因为它锁定了对象(如果没有锁定)。 我只想检查它是否被锁定以及我的代码中的其他地方我将使用Monitor类来锁定对象。 我知道可以使用例如布尔字段(例如private bool ObjectIsLocked ),但是使用lock-object本身检测它。 下面的示例代码显示了我想要做的事情: private static object myLockObject = new object(); private void SampleMethod() { if(myLockObject /*is not locked*/) // First check without locking it { … // The object will be locked some later in the code if(!Monitor.TryEnter(myLockObject)) return; try { …. } catch(){…} finally { Monitor.Exit(myLockObject); } […]

锁定与ToArray的线程安全foreach访问List集合

我有一个List集合,我想在multithreading应用程序中迭代它。 我需要在每次迭代时保护它,因为它可以被更改,而且当我做foreach时我不想要“收集被修改”的exception。 这样做的正确方法是什么? 每次访问或循环时都使用锁定。 我对死锁感到十分害怕。 也许我只是偏执使用锁而不应该。 如果我走这条路以避免死锁,我需要知道什么? 锁是否相当有效? 每次我做foreach时,使用List 。ToArray()复制到数组。 这会导致性能下降,但很容易做到。 我担心内存颠簸以及复制它的时间。 看起来过分了。 使用ToArray是否安全? 不要使用foreach而是使用for循环。 每次我这样做以确保列表没有收缩时,我不需要进行长度检查吗? 这看起来很烦人。

如何在没有抛出exception的情况下取消等待超时的任务

使用取消令牌取消具有超时(在超时结束之前)的任务时,将引发exception。 例: mytask.start(); bool didTaskRunInTime = mytask.wait(5 mins, _cancelToken); 这意味着我不能继续下面。 //was the task cancelled if (_cancelToken.IsCancelRequested) { // log cancel from user to file etc } if (didTaskRunInTime ) { int taskResult = myTask.Result; // log result to file } else if (!_cancelToken.IsCancelRequested) { // Tell user task timed out , log a message etc […]

异步并等待For循环

我有一个Windows服务,根据计划运行各种作业。 确定要运行的作业后,会将一个计划对象列表发送到迭代列表并运行每个作业的方法。 问题是由于外部数据库调用,某些作业最多可能需要10分钟才能运行。 我的目标是没有一个工作阻止其他队列,基本上一次有多个运行。 我认为使用async和await可以解决这个问题,但我以前从未使用过这些。 现行代码: public static bool Load(List scheduleList) { foreach (Schedule schedule in scheduleList) { Load(schedule.ScheduleId); } return true; } public static bool Load(int scheduleId) { // make database and other external resource calls // some jobs run for up to 10 minutes return true; } 我尝试更新到这段代码: public async static Task LoadAsync(List […]

从同步方法调用异步方法

我试图从同步方法运行异步方法。 但我无法等待 异步方法,因为我在同步方法中。 我不能理解TPL,因为这是我第一次使用它。 private void GetAllData() { GetData1() GetData2() GetData3() } 每个方法都需要先前的方法来完成,因为第一个方法的数据用于第二个方法。 但是,在每个方法中我都想启动多个Task操作以加快性能。 然后我想等他们所有人完成。 GetData1看起来像这样 internal static void GetData1 () { const int CONCURRENCY_LEVEL = 15; List<Task> dataTasks = new List<Task>(); for (int item = 0; item < TotalItems; item++) { dataTasks.Add(MyAyncMethod(State[item])); } int taskIndex = 0; //Schedule tasks to concurency level (or all) […]

新的Thread()和垃圾收集

我有以下代码: new Thread(new ThreadStart(delegate() { while (true) { //something } })).Start(); 垃圾收集器可以在处于Running状态时完成此Thread实例吗?

为所有线程设置默认线程文化?

可能重复: 设置应用程序的CurrentCulture和CurrentUICulture 我想为我在我的应用程序中打开的每个线程设置默认文化。 有没有办法设置它(不单独在每个线程上设置它) 谢谢

为什么Thread.Sleep()是如此CPU密集型?

我有一个带有这个pseduo代码的ASP.NET页面: while (read) { Response.OutputStream.Write(buffer, 0, buffer.Length); Response.Flush(); } 请求此页面的任何客户端将开始下载二进制文件。 此时一切正常,但客户端的下载速度没有限制,因此将上述代码更改为: while (read) { Response.OutputStream.Write(buffer, 0, buffer.Length); Response.Flush(); Thread.Sleep(500); } 速度问题现在已经解决,但是在测试中有100个并发客户端一个接一个地连接(每个新连接之间延迟3秒),当客户端数量增加时CPU使用率增加,当70到80个并发客户端CPU达到100%时CPU使用率增加并且任何新连接都被拒绝。 其他机器上的数字可能不同,但问题是为什么Thread.Sleep()是如此CPU密集型,有没有办法加速客户端没有CPU上升? 我可以在IIS级别执行此操作,但我需要从应用程序内部进行更多控制。

挥发性围栏演示?

我试图看看栅栏是如何应用的。 我有这个代码(无限期地阻止): static void Main() { bool complete = false; var t = new Thread(() => { bool toggle = false; while(!complete) toggle = !toggle; }); t.Start(); Thread.Sleep(1000); complete = true; t.Join(); // Blocks indefinitely } 写volatile bool _complete; 解决问题。 获得围栏: 获取栅栏可防止其他读/写在栅栏之前移动; 但是,如果我用箭头↓来说明它(想想箭头就可以把所有东西推开。) 所以现在 – 代码看起来像: var t = new Thread(() => { bool toggle […]

nHibernate会话和multithreading

我有一个方法,有很多持久性调用使用nHibernate会话,它工作,没关系。 但是出于multithreading的原因,我需要重构这个方法,从循环内的内容中提取方法。 然后我用这个方法创建了一个类。 它就像一个正常的重构,但是这个方法调用中的nHibernate会话被破坏了,没有上下文,我没有随时完成它。 multithreading有nHibernate问题吗? 即使我只有一个线程正在执行,我也有同样的问题。 我通过SessionFactory和Façade模式使用nHibernate Session,这意味着,会话不是这些对象的字段,它在SessionFactory是全局的。 让它更清晰一点: 之前: Method() { … persistence calls foreach(Thing..) { …persistence calls for each thing (1) } … } 后: Method() { … persistence calls foreach(Thing..) { create a thingResolver object with some data open a new thread with thingResolver.Method (1) starts this thread } .. waits for […]