多线程、Handler机制、ThreadLocal
全部标签 我有一个非常古老但非常大的库,我正在考虑将其转换为C#类库。现有的库使用了很多存储在TLS中的全局变量。C#没有全局变量的真正概念,但一种解决方法是使用一个名为GlobalVar之类的静态类,并将它们全部放在此类中,以便可以通过GlobalVar.xxxxxx访问它们但是,我的想法是,这将破坏所有正在转换的现有代码,因为GlobalVar类将是一个普通的全局类,而不是每个线程存储。有没有办法让这些全局变量成为每个线程?即C#中__declspec(thread)static的等价物是什么?我应该补充一点,我讨厌全局变量。我认为它们通常是设计不佳的结果。但是,由于时间紧迫,第一阶段是将库
我想写的代码是这样的:voidMethodOnThreadA(){for(;;){//Dostuffif(ErrorConditionMet)ThrowOnThread(threadB,newMyException(...));}}voidMethodOnThreadB(){try{for(;;){//Dostuff}}catch(MyExceptionex){//Dotherightthingforthisexception.}}我知道我可以让线程B以线程安全的方式定期检查线程A是否设置了标志,但这会使代码更加复杂。我可以使用更好的机制吗?这是一个更具体的定期检查示例:Diction
考虑Socket.BeginSend()方法。如果两个线程池线程同时调用此方法,它们各自的消息最终会相互混合还是套接字类会阻止这种情况发生? 最佳答案 .NETSocket实例不是线程安全的,因为同时调用某些方法(相同或不同的方法)可能会导致状态不一致。但是,BeginSend()和BeginReceive()方法本身是线程安全的。对每个(或两者)进行多次未完成调用是安全的。在BeginReceive()的情况下,当数据以调用的顺序可用时,它们将被服务。例如,如果您的处理时间很长,但您希望其他接收尽快发生,这将很有用。当然,在这种情
我正在尝试在C#应用程序中同时运行3个级别的计时器例如:T1将在应用程序的开头运行,然后在其Tick事件上,T2将启动然后在T2的tick事件上,T3将启动。最后,在T3的tick事件上,应该在应用程序的主线程中做一些事情我的问题似乎是主线程中的代码在被其他线程调用时不工作如何让主线程通过其他线程的调用来运行它的功能? 最佳答案 问题很可能是您的主线程需要调用。如果您要在调试器中运行您的程序,您应该看到跨线程操作异常,但在运行时此异常检查被禁用。如果你的主线程是一个表单,你可以用这个简短的代码来处理它:if(InvokeRequir
我想要对自动实现的属性进行线程安全的读写访问。我在C#/.NET框架中缺少此功能,即使在它的最新版本中也是如此。充其量,我会期待类似的东西[Threadsafe]publicint?MyProperty{get;set;}我知道有各种代码示例可以实现此目的,但我只是想在自己实现某些东西之前确保仅使用.NET框架方法仍然无法做到这一点。我错了吗?编辑:由于一些答案详细阐述了原子性,我想声明我只想拥有它,据我所知:只要(且不超过)一个线程正在读取属性的值,不允许其他线程更改该值。因此,多线程不会引入无效值。我选择了int?类型,因为这是我目前关心的问题。编辑2:Ihavefoundthes
我需要枚举对象的通用IList。列表的内容可能会改变,就像被其他线程添加或删除一样,这将终止我的枚举,并显示“集合已修改;枚举操作可能无法执行。”在IList上执行线程安全foreach的好方法是什么?最好不要克隆整个列表。无法克隆列表引用的实际对象。 最佳答案 克隆列表是最简单和最好的方法,因为它可以确保您的列表不会因您而异。如果列表太大而无法克隆,请考虑在其周围放置一个必须在读取/写入之前获取的锁。 关于c#-列表的每个枚举都是线程安全的,我们在StackOverflow上找到一个类
我在一个循环中运行一个进程,它对它每天执行的操作数有限制。当它达到这个限制时,我目前已经让它循环检查时间以查看它是否是新日期。最好的选择是:不断检查新日期的时间计算到午夜还有多少秒,然后睡那段时间还有别的吗? 最佳答案 不要为这种类型的事情使用Thread.Sleep。使用Timer并计算您需要等待的时间。varnow=DateTime.Now;vartomorrow=now.AddDays(1);vardurationUntilMidnight=tomorrow.Date-now;vart=newTimer(o=>{/*Dowor
我正在构建一个C#桌面应用程序。如何在线程中调用采用多个参数的方法。我有一个名为Send(stringarg1,stringarg2,stringarg3)的方法,我需要使用一个名为SendingThread的线程来调用此方法。谁能帮忙解决这个问题?任何帮助将不胜感激。 最佳答案 Threadthread=newThread(()=>Send(arg1,arg2,arg3));thread.Start(); 关于c#-如何在线程中调用带多个参数的方法?,我们在StackOverflow上
我正在编写一个客户端模拟程序,其中所有模拟客户端都针对服务器运行一些预定义的例程-这是一个在Azure中运行的具有四个实例的Web服务器。所有模拟客户端在连接到服务器后运行相同的程序。任何时候我都想使用我的程序模拟300到800个客户端。我的问题是:我应该创建客户端类的N个实例并在N个不同的线程中运行它们吗?或者我应该使用任务库来做这些事情吗? 最佳答案 您当然不应该创建800个线程。让我们回到这里。您有一个称为“服务器”的设备,它接收来自“客户”的“请求”并将“响应”发送回这些客户。假设请求是邮局投递的纸片,响应是装书的盒子,也是
标准System.Timers.Timer行为存在问题。计时器以一定间隔引发Elapsed事件。但是当Elapsed事件处理程序中的执行时间超过计时器间隔时,线程池开始排队处理事件。这是我的问题。这是因为我使用Elapsed事件处理程序从数据库中获取一些数据并对其进行处理,最后将结果保存回数据库。但是数据处理应该只提供一次。那么,有没有一种方法可以防止对System.Timers.Timer的经过事件进行排队。作为此问题的说明,您可以考虑下一个测试程序:publicclassEntryPoint{privatestaticvoidTimeProc(objectstate,Elapsed