草庐IT

多线程、Handler机制、ThreadLocal

全部标签

c# - .NET 线程 - 分配需要锁

我有一些多线程代码,我想提高一点性能,所以我想知道是否可以摆脱锁。我有一个现场成员:privateIListstatus;它在这样的线程中更新:status=GetUpdatedStatus();它在另一个线程中使用,如下所示:varcurrentStatus=status;所以问题是,如果没有锁定两个赋值语句,上面的代码会产生任何问题吗?我想我能看到的唯一情况是currentStatus为null,但我再次希望分配在某种程度上是线程安全的(它是否已更改引用) 最佳答案 你是对的。您将看到作业,或者看不到它。引用的分配(和读取)始终

c# - 调用线程必须是 STA,因为在 WPF 中很多 UI 组件都需要这个

这个问题在这里已经有了答案:"ThecallingthreadmustbeSTA,becausemanyUIcomponentsrequirethis"errorwhencreatingaWPFpop-upWindowinthread(2个答案)关闭1年前。我的场景:voidInstaller1_AfterInstall(objectsender,InstallEventArgse){try{MainWindowObjMain=newMainWindow();ObjMain.Show();}catch(Exceptionex){Log.Write(ex);}}我收到错误消息“调用线程必

c# - 主线程结束时线程不会终止

我有一个奇怪的问题:在我的C#应用程序中,我正在创建另一个线程,如下所示:ThreadprintThread=newThread(printWorker);printThread.Name="LoggerMainThread";printThread.IsBackground=true;printThread.Start();当我的主线程结束时,这个新线程继续工作,尽管它被标记为后台。这可能是什么原因造成的?这个对象持有一个Mutex对象,不确定这可能是原因......有什么想法吗?这是来自printWorker方法的代码:while(loggerIsActive){LogMessag

c# - 使用 C# 在 Windows 8 上获取当前线程 ID

System.Threading.Thread(带有.CurrentThread.ThreadId等)已从WinRT中删除。是否可以在Windows8中获取当前线程ID(用于调试和日志记录目的?)? 最佳答案 参见Environment.CurrentManagedThreadId在Windows商店应用程序中受支持。.NETforWindowsStoreappsSupportedin:Windows8 关于c#-使用C#在Windows8上获取当前线程ID,我们在StackOverfl

c# - RunAsync - 如何等待 UI 线程上的工作完成?

在等待Dispatcher.RunAsync时,继续会在工作安排时发生,而不是在工作完成时发生。我如何等待工作完成?编辑我最初的问题假设过早继续是由API的设计引起的,所以这是真正的问题。当使用异步委托(delegate)等待Dispatcher.RunAsync时,在委托(delegate)代码中使用await时,遇到await时会继续,不是在工作完成时。我如何等待工作完成?编辑2您可能需要分派(dispatch)已在UI线程上的工作的一个原因是解决微妙的时间和布局问题。视觉树中元素的大小和位置的值不断变化是很常见的,为UI的后续迭代安排工作会有所帮助。

c# - IEnumerable<T> 线程安全?

我有一个填充List的主线程.此外,我创建了一个将在不同线程上执行的对象链,需要访问列表。原始列表生成后将永远不会被写入。我的想法是将列表传递为IEnumerable到在其他线程上执行的对象,主要是为了不允许那些实现这些对象的人错误地写入列表。换句话说,如果保证不写入原始列表,多线程使用.Where是否安全?或foreach在IEnumerable上?如果原始集合从未更改,我不确定迭代器本身是否是线程安全的。 最佳答案 IEnumerable无法修改。那么什么可以是非线程安全的呢?(如果您不修改实际的List)。对于非线程安全,您需

c# - 让线程等待 n 个脉冲

我如何等待n个脉冲?…//dosomethingwaiter.WaitForNotifications();我希望上面的线程等待直到被通知n次(被n个不同的线程或n次被同一个线程通知)。我相信有一种计数器可以执行此操作,但我找不到。 最佳答案 看看CountdownEventClass:CountdownEventClassRepresentsasynchronizationprimitivethatissignaledwhenitscountreacheszero.示例:CountdownEventwaiter=newCountd

c# - IOCP 线程 - 澄清?

阅读后thisarticle其中指出:Afteradevicefinishesitsjob,(IOoperation)-itnotifiestheCPUviainterrupt..........However,that“completion”statusonlyexistsattheOSlevel;theprocesshasitsownmemoryspacethatmustbenotified.........Sincethelibrary/BCLisusingthestandardP/InvokeoverlappedI/Osystem,ithasalreadyregisteredt

c# - 多个线程向一个列表添加元素。为什么列表中的项目总是比预期的少?

下面的代码解释了我的问题。我知道列表不是线程安全的。但这背后的“真正”原因是什么?classProgram{staticvoidMain(string[]args){ListstrCol=newList();for(inti=0;i{AddElements(strCol);}).ContinueWith((t)=>{WriteCount(strCol,id.ToString());});}Console.ReadLine();}privatestaticvoidWriteCount(ListstrCol,stringid){Console.WriteLine(string.Format

c# - 线程完成时通知,不锁定调用线程

我正在开发基于NET3.5构建的遗留应用程序。这是我无法改变的约束。我需要执行第二个线程来运行长时间运行的任务而不锁定UI。当线程完成时,我需要以某种方式执行回调。现在我尝试了这个伪代码:Thread_thread=newThread(myLongRunningTask){IsBackground=True};_tread.Start();//waituntilit'sdone_thread.Join();//executefinalizer不锁定UI的第二个选项如下:Thread_thread=newThread(myLongRunningTask){IsBackground=Tru