草庐IT

线程锁

全部标签

c# - 中断休眠线程

有没有办法中断休眠线程?如果我有类似的代码。while(true){if(DateTime.Now.Subtract(_lastExecuteTime).TotalHours>1){DoWork();_lastExecuteTime=DateTime.Now();continue;}Thread.Sleep(10000)//Sleep10secondsif(somethingIndicatingQuit){break;}}我想每小时执行一次DoWork()。所以,我想多睡10秒。说每10分钟左右检查一次。但是,如果将我的sleep设置为10分钟,并且我想终止这个后台任务,我必须等待sl

c# - 我需要在 C# .Net 中创建一个线程安全的静态变量

好吧,它比问题复杂一点。classA{staticintneedsToBeThreadSafe=0;publicstaticvoidM1(){needsToBeThreadSafe=RandomNumber();}publicstaticvoidM2(){print(needsToBeThreadSafe);}}现在我要求在M1()和M2()之间调用“needsToBeThreadSafe”保持线程安全。 最佳答案 怎么样:publicstaticvoidM1(){Interlocked.Exchange(refneedsToBeT

c# - 伙计,我的线程在哪里? (或 : rename a . NET 线程池线程 - 这可能吗?)

有时我发现自己在Debug模式下单步执行一个应用程序,直到我在某个特定的行上点击“步骤”,这会花费太多时间做某事,占用100%的CPU。在这一点上,我点击了“中断”按钮并尝试找出运行时间太长的程序。问题是,这个应用程序有大量的线程在运行,当我点击“中断”时,执行点转到了可能只是在“等待”的GUI线程。然后我必须搜索现有的线程(我数了数——这次是37个!)试图找到我正在执行的线程。我必须查看其中的每一个,直到找到我要找的那一个。我正在运行的线程是异步调用,因此它在线程池线程上运行。我想给这个线程一个描述性的名称,并在操作结束时重置它的名称。问题是,属性Thread.Name只能设置一次,

c# - 当应用程序关闭时,我可以检测到后台线程何时被应用程序杀死吗?

我在C#中使用一个线程,我已将IsBackground属性设置为true。线程在循环中运行一些代码,直到应用程序关闭。当应用程序关闭时,线程也停止执行(因为我设置了IsBackground=true)。应用程序如何终止线程?它似乎不是通过调用中止来完成的,因为我没有得到ThreadAbortException。它发生在幕后吗?我想在循环的finallyblock中做一些回滚。我知道我可以自己在线程上调用abort,但我想知道应用程序如何关闭我的后台线程,以及我是否可以从线程内部对此使用react。我知道我可以订阅Application.ApplicationExit事件,但我在服务和w

c# - 后台 worker 调用之间是否保留了线程本地存储?

是否重用了后台工作线程?具体来说,如果我在backgroundworker的DoWork()方法中设置了一个命名数据槽(线程本地存储),该数据槽的值是否会持续存在,有可能在以后的某个时间被其他线程找到?我不会这么想,但我有这个错误...编辑:Thisblogpost建议BackGroundWorker使用ThreadPool,这意味着线程被重用。所以问题就变成了;重复使用的线程是否可能在调用之间持久保存线程本地存储? 最佳答案 线程池在重用线程时,不会清除线程本地存储中的数据,也不会清除标记有ThreadStaticAttribut

c# - Task.ContinueWith 是否捕获调用线程上下文以继续?

下面的Test_Click是在UI线程上运行的代码的简化版本(带有WindowsFormsSynchronizationContext):voidTest_Click(objectsender,EventArgse){vartask=DoNavigationAsync();task.ContinueWith((t)=>{MessageBox.Show("Navigationdone!");},TaskScheduler.FromCurrentSynchronizationContext());}我是否应该显式指定TaskScheduler.FromCurrentSynchronizat

c# - 如何使 .NET COM 对象成为单元线程?

.NET对象默认是自由线程的。如果通过COM编码到另一个线程,它们总是被编码到自己,无论创建者线程是否为STA,也无论它们的ThreadingModel注册表值如何。我怀疑,他们汇总了FreeThreadedMarshaler(有关COM线程的更多详细信息,请参见here)。我想让我的.NETCOM对象在编码到另一个线程时使用标准的COM编码器代理。问题:usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows

c# - 仅在构造函数中使用私有(private) setter 是否会使对象线程安全?

我知道我可以像这样创建一个不可变的(即线程安全的)对象:classCantChangeThis{privatereadonlyintvalue;publicCantChangeThis(intvalue){this.value=value;}publicintValue{get{returnthis.value;}}}但是,我通常会“作弊”并这样做:classCantChangeThis{publicCantChangeThis(intvalue){this.Value=value;}publicintValue{get;privateset;}}然后我想知道,“为什么这行得通?”它真

c# - 使用 Interlocked 的线程安全 DateTime 更新。*

我可以使用Interlocked.*同步方法来更新DateTime变量吗?我希望在内存中保留最后一次触摸时间戳。多个http线程将更新最后一次触摸DateTime变量。我很欣赏DateTime变量是被替换而不是更新的值类型。我能想到的最好的方法是将时间戳记作为一个long中的总滴答数classx{long_lastHit;voidTouch(){Interlocked.Exchange(ref_lastHit,DateTime.Now.Ticks);}} 最佳答案 选项1:使用带有Interlocked和DateTime.ToBin

c# - 当另一个线程/进程不必要地使用独占锁时,是否可以绕过 C# 中的文件锁?

有没有办法在不终止线程的情况下绕过或删除另一个线程持有的文件锁?我正在我的应用程序中使用第三方库,该库对文件执行只读操作。我需要第二个线程同时读取文件以提取第三方库未公开的一些额外数据。不幸的是,第三方库使用读/写锁打开了文件,因此我得到了通常的“该进程无法访问该文件......因为它正在被另一个进程使用”的异常。我想避免用我的线程预加载整个文件,因为文件很大,会导致加载此文件时不必要的延迟和过多的内存使用。由于文件的大小,复制文件不切实际。在正常操作期间,两个线程访问同一个文件不会导致任何严重的IO争用/性能问题。我不需要两个线程之间完美的时间同步,但它们需要在彼此的半秒内读取相同的