Tag: multithreading

我们真的需要在C#中使用VOLATILE关键字吗?

这是我在工作站上尝试的代码。 class Program { public static volatile bool status = true; public static void Main() { Thread FirstStart = new Thread(threadrun); FirstStart.Start(); Thread.Sleep(200); Thread thirdstart = new Thread(threadrun2); thirdstart.Start(); Console.ReadLine(); } static void threadrun() { while (status) { Console.WriteLine(“Waiting..”); } } static void threadrun2() { status = false; Console.WriteLine(“the bool value is now made FALSE”); […]

用于长查询的.NET线程解决方案

Senerio 我们有一个记录事件的C#.Net Web应用程序。 当事件得到主管批准时,需要查询外部数据库。 对此外部数据库的查询有时需要一段时间才能运行。 这种滞后是通过浏览器体验的。 可能解决方案 我想使用线程来消除模拟的浏览器挂起。 我之前使用过Thread类并听说过ThreadPool 。 但是,我刚在这篇文章中找到了BackgroundWorker 。 MSDN声明 : BackgroundWorker类允许您在单独的专用线程上运行操作。 下载和数据库事务等耗时的操作可能会导致用户界面(UI)在运行时停止响应。 当您需要响应式UI并且遇到与此类操作相关的长时间延迟时,BackgroundWorker类提供了一种方便的解决方案。 在处理长时间运行的查询时, BackgroundWorker是否可行? 当同时运行2个或更多BackgroundWorker进程时会发生什么? 它像游泳池一样处理吗?

只读字典 – 多个线程调用.ContainsKey方法

我有一个静态只读字典。 不会对此词典进行任何修改。 我有多个线程使用.ContainsKey(Key)从这本字典中读取。 例如 class MyData { private static private IDictionary _dictionary = new Dictionary(); MyData() { // Load Dictionary here } public string GetValue(int key) { if (_dictionary.ContainsKey(key)) { return _dictionary[key]; } } } 这样做有任何线程问题吗?

Windows窗体中的线程

我多年来一直在编写ASP.NET Web应用程序,但还没有真正处理大型Windows窗体项目。 我现在需要处理一个,所以我正在寻找关于如何理想地构建大型Windows窗体项目的一些指示。 更具体地说,我想知道如何处理多个线程。 假设您有一个需要一些时间才能完成的过程 – 您不希望ui窗口被冻结且没有响应。 所以逻辑需要在一个单独的线程中移动。 如果此线程访问UI,则会导致exception。 Invoke似乎可以解决这个问题,但看起来非常难看并且阅读起来很麻烦! 那么,实际上,最佳实践是什么? 应该启动什么类型的线程,以及如何在UI和逻辑之间拆分这些线程? 任何示例代码开始?

是不是一味地使用InvokeRequired只是不好的做法?

我是一名新手程序员,所以我可能在这里完全弄错了,但是这个问题让我更加困惑。 这实际上是这个问题的后续行动。 接受的答案是,您必须调用InvokeRequired以避免一些开销,因为您可能已经在UI线程上运行。 理论上,我同意它可以节省一些时间。 经过一些测试后,我发现使用Invoke的时间大约是正常调用操作的两倍(测试类似于设置标签文本n次,或者在RichTextBox中放置一个非常非常大的字符串)。 但! 然后有练习。 MSDN文档说: 此属性可用于确定是否必须调用invoke方法,如果您不知道哪个线程拥有控件,这可能很有用。 在大多数情况下,您确实知道何时尝试从另一个线程访问控件。 实际上,我能想到的唯一情况是,从一个可以被线程X调用的方法以及所有者线程访问控件时。 这对我来说是一个非常不可能的情况。 即使你真的不知道哪个线程试图操纵控件,也有一个事实是UI线程不必经常更新。 对于您的GUI,25-30 fps之间的任何内容都应该没问题。 在UI控件中进行的大多数更改所花费的时间远远少于毫秒。 因此,如果我理解正确,则必须检查是否需要调用的唯一情况是,当您不知道哪个线程正在访问控件时以及GUI更新需要超过大约40毫秒才能完成时。 然后我在http://programmers.stackexchange.com上询问了这个问题的答案。 这表明,当您不需要它时,您不应该忙于过早优化。 特别是如果它牺牲了代码的可读性。 所以这让我想到了一个问题:当你知道一个不同的线程访问一个控件时,你不应该只使用invoke,并且只有当你知道你的UI线程可以访问那段代码并且你发现它应该运行得更快,那么你应检查是否需要调用? PS:在校对我的问题之后,听起来真的像我在咆哮。 但实际上我只是好奇为什么InvokeRequired似乎被许多经验丰富的程序员过度使用。

为什么C#volatile不保护写 – 读重新排序?

根据这本在线书籍 ,C#中的volatile关键字不能防止重新排序Write操作,然后是Read操作。 它给出了这个例子,其中a和b都可以最终设置为0 ,尽管x和y是volatile : class IfYouThinkYouUnderstandVolatile { volatile int x, y; void Test1() // Executed on one thread { x = 1; // Volatile write (release-fence) int a = y; // Volatile read (acquire-fence) … } void Test2() // Executed on another thread { y = 1; // Volatile write (release-fence) int b = […]

在ASP.NET应用程序中执行多个线程上的方法

我有一个ASP.NET应用程序,其中一个请求调用6个非常慢的方法。 这些方法不是异步的,我没有时间重写和测试它们。 如何在6个线程上运行这6个方法,然后对结果进行聚合? 我在.NET 4.5上。

究竟什么“锁定”锁定?

我正在创建一个创建和管理多个套接字连接的类,它将从套接字接收的信息转发到主线程,反之亦然。 我传递大量信息的multithreading对我来说是新的(就像C#中的大多数事情一样),所以我需要澄清locks究竟是做什么的。 当我锁定方法的一部分时,它只确保没有其他线程可以进入该部分代码,或者它是否确实阻止该部分代码中的所有变量被其他线程修改,无论它们出现在何处? 例如: public class TestLock { public volatile int a = 0; public volatile int b = 2; private object ALock = new Object(); public TestLock() { } public void UnlockEdit(int atemp, int btemp) { a = atemp; b = btemp; } public void LockedEdit(int atemp, int btemp) { lock(ALock) { a = […]

用于馈线应用的multithreading架构

这是我在这里的第一篇文章,如果结构不合理,请道歉。 我们的任务是设计一个工具,它将: 读取(帐户ID)文件,CSV格式 从Web下载每个帐户的帐户数据文件(通过Id)(REST API) 将文件传递给将生成报告的转换器(财务预测等)[~20ms] 如果预测阈值在限制范围内,运行解析器来分析数据[400ms] 为上面的分析生成报告[80ms] 将生成的所有文件上传到Web(REST API) 现在所有这些个点都相对容易。 我很想知道如何最好地构建一些东西来处理这个并在我们的硬件上快速有效地完成它。 我们必须处理大约2百万个账户。 方括号可以了解每个流程平均需要多长时间。 我想使用机器上可用的最大资源–24核Xeon处理器。 这不是一个内存密集型过程。 使用TPL并将每个作为一项任务创建是一个好主意吗? 每个都必须按顺序发生,但许多可以一次完成。 不幸的是,解析器不是multithreading感知的,我们没有源(它本质上是我们的黑盒子)。 我的想法是这样的 – 假设我们正在使用TPL: 加载帐户数据(基本上是CSV导入或SQL SELECT) 对于每个帐户(Id): 下载每个帐户的数据文件 继续使用数据文件,发送到转换器 ContinueWith check threshold,发送给解析器 ContinueWith生成报告 ContinueWith上传输出 这听起来可行还是我没有正确理解? 以不同的方式分解步骤会更好吗? 我有点不确定如何处理解析器抛出exception的问题(它非常挑剔)或者当我们上传失败时。 所有这些都将在预定的作业中,作为控制台应用程序在下class后运行。

为什么有些本机线程在我的代码中没有原点的堆栈跟踪?

我使用任务并行库大量使用C#.NET 4.5应用程序,经过几天的操作后最终会因为线程而缺乏资源。 当我从AdPlus中获取HANG转储并通过Visual Studio查看线程时,我看到43个线程在我的代码中没有明显的起源: ntdll.dll!_NtWaitForSingleObject@12() + 0x15 bytes ntdll.dll!_NtWaitForSingleObject@12() + 0x15 bytes kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes 为什么这些线程在堆栈跟踪中没有显示托管源?