Tag: multithreading

.NET计时器是否异步运行?

我有一个使用Jabber-net ( XMPP库 )的应用程序的消息传递方面。 我想做什么,如果由于某种原因与服务器的连接结束,就是每隔一分钟左右继续尝试连接。 如果我在下一次尝试之前启动一个Timer等待一段时间,那个定时器是否异步运行并且生成的Tick事件加入主线程,或者我是否需要启动自己的线程并从那里启动定时器?

如何从后台线程正确更新数据绑定数据网格视图

我有一个实现INotifyPropertyChanged的自定义对象。 我有这些对象的集合,其中集合基于BindingList我已经为集合创建了一个绑定源,并设置了bindingsource和datagridview的数据源。 一切都很好,除了我需要从后台线程更新自定义对象的属性。 当我这样做时,我收到以下错误: BindingSource不能是自己的数据源。 不要将DataSource和DataMember属性设置为引用BindingSource的值 我发现以下post似乎有我的确切问题(和解决方案?)但我无法弄明白。 http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/3566f7c7-eb47-422e-ab09-9549a18da360/ 我在业务对象中创建并初始化了每个post的oper变量,然后将两个事件函数放入我的集合类中。 这个编译正确,但运行时毫无例外地挂起。 我看过许多post说使用Invoke / Begin Invoke,但是我没有调用UI上的任何函数,只是更新业务对象,所以我不确定在哪里调用invoke。 一个限制:我希望业务对象不知道谁在显示它(因为有多个消费者),因此将GUI引用发送到业务对象,以便我以后能够使用这些引用调用invoke不是一个选项。

使链表清单安全

我知道之前已经问过这个问题(我将继续研究),但我需要知道如何以线程安全的方式创建特定的链表function。 我当前的问题是我有一个循环遍历链表中所有元素的线程,另一个可能会在此列表的末尾添加更多元素。 有时会发生这样的情况:一个线程尝试将另一个元素添加到列表中,而第一个元素忙于迭代它(这会导致exception)。 我想只是添加一个变量(布尔标志)来表示列表当前忙于迭代,但是我如何检查它并等待第二个线程(如果它等待,则可以,因为第一个线程运行很快)。 我能想到的唯一方法就是通过使用while循环不断检查这个忙碌的标志。 我意识到这是一个非常愚蠢的想法,因为它会导致CPU在没有任何用处的情况下努力工作。 现在我在这里要求更好的见解。 我已经阅读了关于锁等的内容,但它似乎与我的情况无关,但也许我错了? 与此同时,如果我找到解决方案,我将继续搜索互联网并发回。 编辑:让我知道我是否应该发布一些代码来清理,但我会尝试更清楚地解释它。 所以我有一个带有链表的类,其中包含需要处理的元素。 我有一个线程通过函数调用遍历此列表(让我们称之为“processElements”)。 我有第二个线程,以非确定的方式添加元素进行处理。 但是,有时它会在processElements运行时尝试调用此addElement函数。 这意味着当一个元素被第一个线程迭代时,它被添加到链表中。 这是不可能的,并导致exception。 希望这可以解决它。 我需要添加新元素的线程,直到processElements方法执行完毕。 对任何绊倒这个问题的人。 接受的答案将为您提供快速,简单的解决方案,但请查看下面的Brian Gideon的答案,以获得更全面的答案,这肯定会给您更多的见解!

有没有办法在c#中获取所有线程的堆栈跟踪,比如java.lang.Thread.getAllStackTraces()?

在java中,可以获得所有正在运行的线程的堆栈跟踪的快照。 这是通过java.lang.Thread.getAllStackTraces() (它返回Map )。 如何用.net做到这一点?

任务并行库中的任务如何影响ActivityID?

在使用任务并行库之前,我经常使用CorrelationManager.ActivityId来跟踪multithreading的跟踪/错误报告。 ActivityId存储在线程本地存储中,因此每个线程都有自己的副本。 这个想法是当你启动一个线程(活动)时,你分配一个新的ActivityId。 ActivityId将使用任何其他跟踪信息写入日志,从而可以单独列出单个“活动”的跟踪信息。 这对于WCF非常有用,因为ActivityId可以转移到服务组件。 这是我正在谈论的一个例子: static void Main(string[] args) { ThreadPool.QueueUserWorkItem(new WaitCallback((o) => { DoWork(); })); } static void DoWork() { try { Trace.CorrelationManager.ActivityId = Guid.NewGuid(); //The functions below contain tracing which logs the ActivityID. CallFunction1(); CallFunction2(); CallFunction3(); } catch (Exception ex) { Trace.Write(Trace.CorrelationManager.ActivityId + ” ” + ex.ToString()); } } 现在,通过TPL,我的理解是多个任务共享线程。 这是否意味着ActivityId很容易在任务中间重新初始化(通过另一项任务)? 是否有新的机制来处理活动追踪?

初学者在C#中穿线

你能推荐一系列好文章, 或者最好是一本关于如何开始使用线程的书籍 ,尤其是C#? 我主要是在控制台应用程序和ASP.Net应用程序中寻找线程的使用。 我只了解线程的基础知识,并且知道“这里是龙”,所以在我开始使用它们之前想要得到一个良好的基础。 我很好奇的事情就像是有一个线程池的概念,你如何管理它的大小,你如何选择排队的东西直到一个线程可用而强迫一个新线程开始等等。另外,我明白了IIS有很多内置的线程处理,所以解释如何使用IIS下的ASP.Net中的线程以及它与控制台C#应用程序中的线程的区别是很有趣的。 我的预期用途包括: 用户在ASP.Net页面上做了一些事情,导致我的服务器端代码需要连接到另一个系统并执行冗长的操作,所以我想通过将该操作发送到另一个线程来快速将控制权返回给用户。 用户可以通过AJAX继续观察进度,或者只是离开 – 毕竟网络是无状态的:) 使用Fire和忘记模式(那里有很多示例代码,我想更多地了解它们是如何工作的) 谢谢

异步WPF命令

注意 :如果您需要完整的源代码,则此问题中的代码是deSleeper的一部分。 我想要的命令之一是异步操作的烘焙设计。 我希望在执行命令时按下按钮以禁用,并在完成时返回。 我希望在ThreadPool工作项中执行实际工作。 最后,我想要一种方法来处理异步处理过程中发生的任何错误。 我的解决方案是AsyncCommand: public abstract class AsyncCommand : ICommand { public event EventHandler CanExecuteChanged; public event EventHandler ExecutionStarting; public event EventHandler ExecutionComplete; public abstract string Text { get; } private bool _isExecuting; public bool IsExecuting { get { return _isExecuting; } private set { _isExecuting = value; if (CanExecuteChanged != null) […]

如何创建线程安全的通用列表?

我有一个通用列表如下 public static readonly List Customers = new List(); 我正在使用以下方法: .Add .Find .FirstOrDefault 最后2个是LINQ扩展。 我需要使这个线程安全的能够运行容器类的多个实例。 怎么实现呢?

如何有效地杀死C#中的线程?

老实说 ,我并不是想 打败 一匹 死 马 。 我已经阅读了关于线程查杀的所有建议,但请考虑代码。 它执行以下操作: 它启动一个线程(通过StartThread方法) 它调用数据库查找ServiceBroker队列中的任何内容。 注意WAITFOR命令 – 这意味着它将一直坐在那里直到队列中有东西。 这一切都在MonitorQueue方法中。 杀死线程。 我试过.Interrupt – 它似乎什么也没做。 然后我尝试了.Abort ,永远不应该使用,但即使这样做也没有。 Thread thxMonitor = new Thread(MonitorQueue); void StartThread() { thxMonitor.Start(); } void MonitorQueue(object obj) { var conn = new SqlConnection(connString); conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandTimeout = 0; // forever and ever cmd.CommandType = CommandType.Text; […]

带输入参数的Control.Invoke

根据我在C#中发现的内容,Control.Invoke方法要求您使用没有输入参数的委托。 有没有办法解决? 我想调用一个方法来从另一个线程更新UI并将字符串参数传递给它。