草庐IT

线程id

全部标签

c# - 线程同步。 lock 究竟是如何访问内存 'correct' 的?

首先,我知道lock{}是Monitor类的合成糖。(哦,句法糖)我正在处理简单的多线程问题,发现不能完全理解锁定内存的任意字如何保护整个其他内存不被缓存是寄存器/CPU缓存等。使用代码示例来解释我在说什么更容易关于:for(inti=0;i最后ms_Sum将包含100000000,这当然是预期的。现在我们准备在2个不同的线程上执行相同的循环,并且上限减半。for(inti=0;i由于没有同步,我们得到不正确的结果-在我的4核机器上它是随机数接近52388219这略大于100000000的一半.如果我们将ms_Sum+=1;包含在lock{}中,我们当然会得到绝对正确的结果100000

c# - Dispatcher线程和UI线程有什么区别

UI线程和Dispatcher线程在WPF中是一样的还是有什么区别? 最佳答案 ADispatcher负责管理线程的工作。UI线程是渲染UI的线程。TheUIthreadqueuesworkitemsinsideanobjectcalledaDispatcher.TheDispatcherselectsworkitemsonaprioritybasisandrunseachonetocompletion.EveryUIthreadmusthaveatleastoneDispatcher,andeachDispatchercanexe

c# - 使用/不使用 delegate() 启动线程

有什么区别:newThread(newThreadStart(SomeFunc))和:newThread(delegate(){SomeFunc();})这段代码在我的电脑上给出了奇怪的输出:publicclassA{intNum;publicA(intnum){Num=num;}publicvoidDoObj(objectobj){Console.Write(Num);}publicvoidDo(){Console.Write(Num);}}///////invoidmain()for(inti=0;i如果只执行第1行,输出类似于:0231564789没问题,但如果执行第2行或第3行

c# - 使用 DateTime.Now.Ticks 生成唯一的数字 ID

我需要生成一个唯一的数字ID以附加到传入请求。此ID仅临时用于跟踪请求,一旦请求完成处理将被丢弃。此ID将仅在该应用程序的上下文中使用,但需要以高性能多线程方式分配。我正在考虑将DateTime.Now.Ticks用于此ID,但想知道如果同时处理同时请求,DateTime.Now.Ticks是否仍会生成冲突ID?如果有人可以建议一种在多线程环境中生成这些ID的更好方法(最好是不是像Tick那样的Int64的方法),请告诉我。像递增数字这样简单的东西就足够了,只要我不必在递增之前锁定数字即可。 最佳答案 您只需要使用一个静态变量,每次

c# - 如果另一个线程正在执行它,则退出该方法

我在多线程应用程序中有一个方法,我希望调用此方法时出现以下行为:如果当前没有其他线程正在执行该方法,则执行它。如果另一个线程当前正在执行该方法,则退出该方法而不执行它。C#中的lock语句对于等待线程完成执行很有用,但我不想序列化对此方法的访问,而是绕过执行所述方法(如果它正在被执行)另一个线程。 最佳答案 您可以使用Monitor.TryEnter执行此操作,但也许更简单:互锁:intexecuting;//makethisstaticifyouwantthisone-caller-onlyto//allobjectsinstea

c# - 如何并行运行两个线程?

我通过单击按钮启动两个线程,每个线程调用一个单独的例程,每个例程将打印线程名称和i的值。程序运行完美,但我看到Thread1()函数先运行,然后Thread2()例程开始,但我尝试运行Thread1()和Thread2()都是并行的。我哪里出错了?privatevoidbutton1_Click(objectsender,EventArgse){Threadtid1=newThread(newThreadStart(Thread1));Threadtid2=newThread(newThreadStart(Thread2));tid1.Start();tid2.Start();Mess

c# - 如何在 C# 中执行线程安全函数内存?

此处堆栈溢出found内存单参数函数的代码:staticFuncMemoize(thisFuncf){vard=newDictionary();returna=>{Rr;if(!d.TryGetValue(a,outr)){r=f(a);d.Add(a,r);}returnr;};}虽然这段代码为我完成了它的工作,但当同时从多个线程调用内存函数时,它有时会失败:Add方法使用相同的参数被调用两次并抛出异常。如何使内存线程安全? 最佳答案 您可以使用ConcurrentDictionary.GetOrAdd它做你需要的一切:stati

c# - 从线程向主线程发送异常?

我想将当前线程(该线程不是主线程)的异常传递给主线程。为什么?因为我在另一个线程中检查我的硬锁(该线程使用计时器进行检查),当HardLock不可访问或无效时,我创建了一个由我自己定义的异常,然后抛出该异常。所以那个异常(exception)不能很好地工作。;( 最佳答案 最好的办法是将Thread替换为Task(.NET4.0中的新功能)。Task类处理将异常正确编码到任何检查任务结果的线程。如果无法使用.NET4.0,则Rxextensions中的CoreEx.dll包含一个Exception.PrepareForRethrow

c# - 如何正确关闭已创建多个线程的 C# 应用程序?

我正在编写一个GUI应用程序。应用程序在其生命周期内打开了多个线程。其中一个线程正在处理可能来自其他应用程序的事件,因此它在while(true)循环中等待永远不会终止的事件。用户可以随时关闭应用程序。我想关闭主应用程序打开的所有线程。我正在使用Process.GetCurrentProcess().Kill();暂时解决这个问题。这是一个好的解决方案吗?如果不是,为什么以及处理这个问题的正确方法是什么,如何关闭主应用程序打开的所有线程? 最佳答案 如果您将新线程创建为后台线程(通过在启动它们之前设置IsBackground),它们

c# - 从后台线程通知 UI 线程

我正在尝试在后台下载一些页面,其内容将被插入到数据库中。我需要在某种后台线程(BackgroundWorker或ThreadPool,由于我可以将事情排队的方式而首选)上执行此操作,但我还需要在作业完成后更新UI。如何通知UI线程作业已在WindowsPhone上完成?我见过有人使用Dispatcher.beginInvoke,但不清楚他使用的是什么(Worker或Pool)——这是执行此操作的正确方法吗? 最佳答案 Deployment.Current.Dispatcher.BeginInvoke(()=>{//changeUIh