Tag:

在ui线程中执行委托(使用消息泵)

我有一个后台线程来处理与外部服务的通信。 每次后台线程收到消息时,我都想将其传递给UI线程进行进一步处理(显示给用户)。 目前我已经创建了一个线程安全的消息队列,它在Timer.Tick中定期汇集并填充后台线程。 但这种解决方案是次优的。 你知道如何使用消息泵将事件从后台线程传递到ui线程吗?

C#中的线程:如何保持循环索引线程安全?

在下面的示例中,似乎for循环的索引i由每个线程独立修改,导致DoWork_Threaded()的i奇怪值(倍数,甚至大于System.Environment.ProcessorCount-1值DoWork_Threaded() 如何在C#中正确完成multithreading循环? // Prepare all threads Thread[] threads = new Thread[System.Environment.ProcessorCount]; // Start all threads for (int i = 0; i DoWork_Threaded(i)); threads[i].Start(); } // Wait for completion of all threads for (int i = 0; i < System.Environment.ProcessorCount; i++) { threads[i].Join(); }

在只读静态字段初始化时的线程安全性

如果创建一个只读静态成员,如下所示: public sealed class MyClass { public readonly static MyClass Instance = new MyClass(); } 我们知道如果某个线程第一次访问MyClass,静态构造函数将初始化MyClass.Instance字段。 但是,如果多个线程同时访问MyClass(即静态字段线程安全的初始化),是否会创建单个实例(在本例中为MyClass)?

在富文本框中显示行号c#

我有一个Multiline richtextbox控件,我想要集成添加行号的function。 我考虑过很多方法 添加标签并在行数更改时更新行号 添加一个图片框以在其上绘制字符串。 添加另一个文本框并在其上显示行号 添加列表框并在其中显示行号。 我有两个疑惑。 我正在使用的richtextbox是来自RichTextBox类的自定义控件和文件夹。 如何添加多个控件。 在c#中显示多行文本的行号的最佳方法是什么

是否存在用于防止NullReferenceException的常见模式中的竞争条件?

我问了这个问题并得到了这个有趣(并且有点令人不安)的答案。 Daniel在他的回答中指出(除非我读错了) ECMA-335 CLI规范允许编译器生成从以下DoCallback方法抛出NullReferenceException代码。 class MyClass { private Action _Callback; public Action Callback { get { return _Callback; } set { _Callback = value; } } public void DoCallback() { Action local; local = Callback; if (local == null) local = new Action(() => { }); local(); } } 他说,为了保证不抛出NullReferenceException ,应该在_Callback上使用volatile关键字,或者在local = Callback;行周围使用lock local = […]

挥发性违反其主要工作?

根据MSDN : volatile关键字表示某个字段可能被同时执行的多个线程修改。 声明为volatile的字段不受编译器优化的约束,这些优化假定单个线程进行访问。 这可确保始终在字段中显示最新值。 请注意最后一句: 这可确保始终在字段中显示最新值。 但是,此关键字存在问题。 我已经读过它可以改变指令的顺序: First instruction Second instruction Can they be swapped? Read Read No Read Write No Write Write No Write Read Yes! <—- 这意味着约翰将一个值设置为一个易变的字段, 后来保罗想要阅读该字段,保罗正在获得旧的价值! 这是怎么回事? 这不是主要的工作吗? 我知道还有其他解决方案,但我的问题是关于volatile关键字。 我(作为程序员)是否需要阻止使用此关键字 – 因为这种奇怪的行为?

哪些function使类成为线程安全的?

在MSDN中,一些.NET类描述如下: “ 这种类型是线程安全的。 ” 要么 “ 此类型的公共静态(在Visual Basic中为Shared)成员是线程安全的。实例成员不保证是线程安全的。” 我的问题是哪些function使类成为线程安全的? 线程安全编程是否有任何标准,建议或指南? 当我使用lock(C#)关键字时,这意味着我的类是否是线程安全的? 如何评估一个类的线程安全性? 是否有任何测试可以确保一个类是100%线程安全的? 例: public class MyClass { public void Method() { lock (this) { // Now, is my class 100% thread-safe like Microsoft classes? } } type m_member1; type m_member2; } 谢谢

如何使类线程安全

我正在写一个C#应用程序。 我有(一种)日志记录类。 并且许multithreading将使用此日志记录类。 如何使这个类线程安全? 我应该把它作为单身人士吗? 有什么最好的做法? 是否有一个文件,我可以阅读有关如何使其线程安全? 谢谢

BackgroundWorker.CancellationPending是如何线程安全的?

取消BackgroundWorker操作的方法是调用BackgroundWorker.CancelAsync() : // RUNNING IN UI THREAD private void cancelButton_Click(object sender, EventArgs e) { backgroundWorker.CancelAsync(); } 在BackgroundWorker.DoWork事件处理程序中,我们检查BackgroundWorker.CancellationPending : // RUNNING IN WORKER THREAD void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { while (!backgroundWorker.CancellationPending) { DoSomething(); } } 上述想法遍布整个网络,包括在BackgroundWorker的MSDN页面上 。 现在,我的问题是:这个线程安全怎么样? 我查看了ILSpy中的BackgroundWorker类 – CancelAsync()只是将cancellationPending设置为true而不使用内存屏障,而CancellationPending只返回cancellationPending而不使用内存屏障。 根据这个Jon Skeet页面 ,上面的内容不是线程安全的。 但是BackgroundWorker.CancellationPending的文档说:“这个属性是供工作线程使用的,它应该定期检查CancellationPending并在设置为true时中止后台操作。” 这里发生了什么? 它是否是线程安全的?

使用Thread.Sleep短时间的问题

我有一个2线程(现在)的应用程序,但似乎函数Thread.Sleep()不能很好地工作。 它会占用线程,但需要花费更多的时间(例如 – 我想睡5分钟,睡眠时间为0.3秒或更长)。 这是代码: int vlakien = 2; Thread[] vlakna; vlakna = new Thread[vlakien]; for (int i = 0; i < vlakien; i++) { try { vlakna[i] = new Thread(new ThreadStart(utok)); vlakna[i].Start(); } } private void utok() { //some code Thread.Sleep(5); //some code } 此外,我试图在functionutok中使用秒表睡觉它也需要更多时间: Stopwatch SW = new Stopwatch(); SW.Start(); while(SW.ElapsedMilliseconds < 5000) […]