Tag: multithreading

C#是否具有“ThreadLocal”模拟(对于数据成员)到“ThreadStatic”属性?

我发现“ThreadStatic”属性最近非常有用,但现在我想要一个“ThreadLocal”类型属性,它允许我在每个线程的基础上拥有非静态数据成员。 现在我知道这会产生一些非平凡的影响,但是: C#/ .net中是否已经内置了这样的东西? 或者因为到目前为止它的答案是否定的(对于.net <4.0),是否有一个常用的实现? 我可以想出一个合理的方法来实现它,但只会使用已经存在的东西,如果可用的话。 如果它还不存在,那么它将实现我正在寻找的东西: class Foo { [ThreadStatic] static Dictionary threadLocalValues = new Dictionary(); int defaultValue = 0; int ThreadLocalMember { get { int value = defaultValue; if( ! threadLocalValues.TryGetValue(this, out value) ) { threadLocalValues[this] = value; } return value; } set { threadLocalValues[this] = value; } } } 请原谅任何C#无知。 我是一名C […]

SQL CLR中的multithreading缓存

是否有任何multithreading缓存机制可以在SQL CLR函数中工作,而不需要将程序集注册为“不安全”? 正如本文所述,只需使用lock语句就会在安全程序集上引发exception: System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host. The protected resources (only available with full trust) were: All The demanded resources were: Synchronization, ExternalThreading 我希望对函数的任何调用都以线程安全的方式使用相同的内部缓存,以便许多操作可以同时执行缓存读取和写入。 本质上 – 我需要一个可以在SQLCLR“安全”程序集中使用的ConcurrentDictionary 。 不幸的是,使用ConcurrentDictionary本身会产生与上面相同的exception。 是否有内置的SQLCLR或SQL Server来处理这个问题? 或者我误解了SQLCLR的线程模型? 我已经阅读了关于SQLCLR的安全限制的内容。 特别是,以下文章可能有助于理解我在说什么: SQL Server CLR集成第1部分:安全性 使用CLR和T-SQL部署/使用需要不安全/外部访问的程序集 此代码最终将成为分发给其他人的库的一部分,因此我真的不希望将其作为“不安全”运行。 我正在考虑的一个选项(由Spender在下面的评论中提出)是从SQLCLR代码中扩展到tempdb并将其用作缓存。 但我不太清楚到底该怎么做。 我也不确定它是否会像内存缓存一样高效。 请参阅下面的更新 我对可能提供的任何其他替代方案感兴趣。 谢谢。 例 […]

C#multithreading – 无控件调用

我对multithreading有点熟悉,因为我已经读过它,但从未在实践中使用它。 我有一个项目使用第三方库,通过引发事件来共享输入设备的状态。 问题是,编写库的方式这些事件是从不同的线程引发的。 我的应用程序不需要是multithreading的,我遇到了很多经典的线程问题(UI控件抱怨从不同的线程进行交互,集合被修改为一段代码迭代它,等等)。 我只想将第三方库的事件返回给我的UI线程。 具体我认为应该发生的是: 我的类接收事件,处理程序正在与UI不同的线程上运行。 我想检测这种情况(比如使用InvokeRequired),然后执行BeginInvoke的等效操作以将控制权交还给UI线程。 然后可以在类层次结构上发送正确的通知,并且只有一个线程触及我的所有数据。 问题是,接收这些输入事件的类不是从Control派生的,因此没有InvokeRequired或BeginInvoke。 原因是我试图干净地分离UI和底层逻辑。 该类仍然在UI线程上运行,它在类本身内部没有任何UI。 现在我通过破坏这种分离来解决问题。 我传入一个引用控件,该控件将显示来自我的类​​并使用其 Invoke方法的数据。 这似乎违背了分离它们的整个目的,因为现在底层类直接依赖于我的特定UI类。 也许有一种方法可以保存对运行构造函数的线程的引用,然后在Threading命名空间中会有一些执行Invoke命令的东西? 有没有解决的办法? 我的方法完全错了吗?

阅读C#中的介绍 – 如何防范它?

MSDN杂志中的一篇文章讨论了Read Introduction的概念,并给出了一个可以被它破坏的代码示例。 public class ReadIntro { private Object _obj = new Object(); void PrintObj() { Object obj = _obj; if (obj != null) { Console.WriteLine(obj.ToString()); // May throw a NullReferenceException } } void Uninitialize() { _obj = null; } } 注意这个“可能抛出NullReferenceException”的注释 – 我从来不知道这是可能的。 所以我的问题是:我如何防止阅读介绍? 我也非常感谢编译器决定引入读取时的确切解释,因为该文章不包括它。

在C#中使用multithreading加速循环(问题)

想象一下,我有一个function,它通过一百万个/十亿字符串并检查其中的smth。 f.ex: foreach (String item in ListOfStrings) { result.add(CalculateSmth(item)); } 它消耗了大量的时间,因为CalculateSmth是非常耗时的function。 我想问一下:如何在这种过程中集成multithreading? f.ex:我想启动5个线程,每个线程返回一些结果,直到列表中有项目为止。 也许任何人都可以展示一些例子或文章.. 忘记提到我需要它在.NET 2.0中

在WPF中显示“等待”屏幕

我正在尝试为长时间运行的操作显示请等待对话框。 问题是因为这是单线程,即使我告诉WaitScreen显示它永远不会。 有没有办法可以改变屏幕的可见性并立即显示? 我将Cursor调用作为示例包含在内。 在我调用this.Cursor之后,光标立即更新。 这正是我想要的行为。 private void Button_Click(object sender, RoutedEventArgs e) { this.Cursor = System.Windows.Input.Cursors.Pen; WaitScreen.Visibility = Visibility.Visible; // Do something long here for (Int32 i = 0; i < 100000000; i++) { String s = i.ToString(); } WaitScreen.Visibility = Visibility.Collapsed; this.Cursor = System.Windows.Input.Cursors.Arrow; } WaitScreen只是一个Z-index为99的网格,我隐藏并显示。 更新:我真的不想使用后台工作者,除非我必须这样做。 代码中有许多地方会出现这种启动和停止。

按字符串锁定。 这样安全/理智吗?

我需要按字符串锁定一段代码。 当然,以下代码非常不安全: lock(“http://someurl”) { //bla } 所以我一直在做一个替代品。 我通常不会在这里发布大量的代码,但是当涉及到并发编程时,我有点担心我自己的同步方案,所以我提交我的代码来询问是否理智这样做以这种方式或是否有一个更直接的方法。 public class StringLock { private readonly Dictionary keyLocks = new Dictionary(); private readonly object keyLocksLock = new object(); public void LockOperation(string url, Action action) { LockObject obj; lock (keyLocksLock) { if (!keyLocks.TryGetValue(url, out obj)) { keyLocks[url] = obj = new LockObject(); } obj.Withdraw(); } Monitor.Enter(obj); try { […]

C#代理是否是线程安全的?

如果你有一个带有委托成员变量的类实例,并且多个线程调用该委托(假设它指向一个长期运行的方法),是否存在任何争用问题? 你是否需要锁定委托,或者每个线程调用委托所指向的方法是否安全,因为每个线程都有自己的调用堆栈?

C#Threading – 如何启动和停止线程

任何人都可以给我一个关于线程主题的开端吗? 我想我知道如何做一些事情,但我需要知道如何做以下事情: 设置一个主线程,它将保持活动状态,直到我发出信号停止为止(如果你想知道,它会在收到数据时终止)。 然后我想要第二个线程开始,它将从文本框中捕获数据,当我发出信号时,应该退出当用户按下回车键时。 干杯!

启动多个线程并从我的.NET应用程序中跟踪它们

我想从我的.NET应用程序启动x个线程,我想跟踪它们,因为我需要手动终止它们,或者我的应用程序稍后关闭我的应用程序。 示例==>启动线程Alpha,启动线程测试..然后在我的应用程序中的任何点我应该能够说终止线程测试.. 在.NET中跟踪打开的线程的最佳方法是什么?我需要知道什么(一个id?)关于一个线程来终止它? 示例代码,教程会很有帮助。