Tag: multithreading

为什么整数属性有时会返回0?

[编辑:我意识到失败的参数实际上是一个双精度而不是一个整数。 根据日志,整数计时器都不会失败。 大多数计时器和参数都是整数,但不是全部。 双打不是primefaces的,毕竟缺乏锁定可能是个问题。 我有一个应用程序,它使用包含可配置值属性的类。 应用程序中使用的大多数属性都是派生的。 这些值在启动时设置,在应用程序的主要部分运行时不会更改。 private int _TimerInterval; public int TimerInterval { get { return _TimerInterval; } } private int _Factor1; public int Factor1 { set { _Factor1 = value; _TimerInterval = _Factor1 * _Factor2; } get { return _Factor1; } } private int _Factor2; public int Factor2 { set { _Factor2 = […]

在Silverlight中,您如何确定代码是否在UI线程中运行?

基本上我需要知道我是否需要Dispatcher.BeginInvoke或者是否需要它。 谢谢。

计时器在交叉线程中不起作用

我的表单中有2个全局System.Windows.Forms.Timer 。 两者都在表单的构造函数中初始化。 但尚未开始。 构造函数启动一个新线程 ,该线程启用并启动两个计时器。 显然它是所有交叉线程 ,但它不会抛出任何跨线程exception。 但它甚至不起作用。 它不会触发Timer.Tick方法。 这是代码: 第一种方法: 在表单构造函数中: KeepMeAliveTimer = new Timer(); //timer 1 KeepMeAliveTimer.Interval = 15000; KeepMeAliveTimer.Tick += KeepMeAlive; timer1 = new Timer(); //timer 2 timer1.Interval = 15000; timer1.Tick += timer1_Tick; //started a new thread 在新的thead: //after performing some tasks, it enables the timers KeepMeAliveTimer.Enabled = true; //timer 1 […]

如何正确使用实时优先级

我的问题可能并不是真正的实时处理,但话说可能是。 我的应用程序有几个比GUI重要得多的线程,但我确实希望GUI至少可以使用。 我不希望它一直被锁定,我确实想要更新屏幕给出我正在执行的处理结果。 目前我所有必需的项目都是在单独的线程中隔离的,我调用GUI的代理来显示结果。 我的GUI工作,但如果我更改标签,或最小化/最大化它,已知会阻碍我的其他线程,他们无法在0.1s的时间限制内执行操作。 这就是我打电话给我的代表所做的事情: delegate void FuncDelegate(ResultContainer Result); FuncDelegate DelegatedDisplay= new FuncDelegate(DisplayResults); //then later on Invoke(DelegatedDisplay, Result); 我的大多数关键进程都是在连续循环中运行的线程,从各种缓冲区(ArrayLists和普通列表)拉出并推送到各种缓冲区。 每次都会启动我的一个关键线程,使用: Thread mythread = new Thread(new ThreadStart(ProcessResults)); mythread.Start(); 我之所以这样做,而不是只是让一个线程在一个循环中运行,从列表中拉出来的原因,我想也许我的时钟时间用完的原因是我有一个我担心消耗太多的轮询循环资源(虽然每次轮询结果为负时我都使用Thread.Sleep(5))。 每次我需要并发进程时启动一个新线程会花费我宝贵的时间吗? 这应该是一个循环吗? 我的循环应该受到责备吗? 我可以给一个线程比其他线程更高的优先级,还是使用Thread.Sleep我唯一的选择? 如果我确定分配更高的线程优先级,我怎么能确定其他线程甚至可以存活? 为什么简单的表单事件会妨碍我的其他线程呢? 有没有办法为我的GUI线程分配较少量的资源? 如果其他线程的时钟时间不足,我可以使用Thread.Sleep以某种方式阻止Form事件吗? 如果没有我所有令人沮丧的问题的答案,是否有某种线程分析器可以用来帮助解决我的问题? 我尝试使用“托管堆栈资源管理器”,但不知何故,它并不总是显示我的应用程序有什么线程。 对此事的任何帮助都会对我有所帮助。

调度任务以供将来执行

我查看了Task和Timer类API,但无法找到有关如何安排Task以供将来执行的信息。 使用Timer类,我可以调度线程以供将来执行,但我需要安排Task 。 Task有.Delay(…)方法,但不确定延迟与调度类似。 编辑(澄清):我想在x分钟后启动任务。

volatile作为同步机制

假设我有一个类Foo,它有一个名为Count的静态成员变量(类型为整数)。 此变量用于multithreading应用程序,我在对此变量进行任何读/写操作之前使用锁同步机制。 正如我正在阅读本文的易变性我得到的印象是我可以删除围绕此变量的所有锁定,并在声明此变量时使用volatile关键字。 这应该照顾所有与synchnronization相关的东西。 它是否正确? 这种方法有哪些优缺点?

为什么方法调用将非易失性变量的值刷新到主线程?

为什么吸气剂Val碰巧模拟了场val波动? 我假设利用方法调用不是保持变量volatile的可靠方法。 (要试用它,构建版本并直接执行而不需要调试器。) class Program { private int val = 0; public int Val { get { return val; } } public static void Main() { var example = new Program(); Task.Run(() => example.val++); while (example.val == 0) ; // Hangs if val is not volatile while (example.Val == 0) ; // Never seems to […]

在c#中,如何在multithreading环境中迭代IEnumerable

我在这种情况下,有一个大字典,由一个线程以相当高的频率随机更新,还有另一个线程试图将字典的快照保存为历史记录。 我目前正在使用这样的东西: Dictionary dict = new Dictionary(); var items = dict.Values.ToList(); 这在大多数情况下都可以正常工作,除非它偶尔抛出: System.InvalidOperationException:集合已被修改; 枚举操作可能无法执行。 我理解为什么会这样,但我不知道我该怎么做才能避免收集修改错误。 迭代此类集合的最佳方法是什么? 我也试过ConcurrentDictionary,但没有运气。 为什么? ConcurrentDictionary线程只在项目级别安全吗?

为什么我没有得到“跨线程操作无效”错误

我使用BackgroundWorker并执行此操作: private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e) { this.Text = “RunWorkerAsync()”; backgroundWorkerLoading.RunWorkerAsync(); } private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e) { UnsafeThreadMethod(“hello”); EvenUnsaferThreadMethod(); } 而现在这两种方法。 private void UnsafeThreadMethod(string text) { toolStripLabelRssFeedData.Text = text; } private void EvenUnsaferThreadMethod() { panelLoading.Visible = true; } 我不明白为什么UnsafeThreadMethod不会抛出以下exception,但EvenUnsaferThreadMethod会抛出exception。 跨线程操作无效:控制’panelLoading’从其创建的>线程以外的线程访问。 根据消息,因为toolStripLabelRssFeedData是在同一个线程上创建的,但事实并非如此。 我以为我不能调用主线程创建的控件,必须使用ProgressChanged事件。 这是怎么回事? 我还有第二个问题。 当我可以使用ProgressChanged时,这样做有什么好处? 我该怎么办? private void EvenUnsaferThreadMethod() { if (panelLoading.InvokeRequired) […]

绑定数据更改时Winforms列表框不更新

下图显示了我的代码的工作原理。 当我按下按钮2时,列表框会更新,但不会在我按下按钮1时更新。 为什么? 伪代码http://sofzh.miximages.com/c%23/mj69oj.gif 问题线程是否相关? 如果是,我应该在哪里添加对(Begin)Invoke的调用? 需要注意的一件有趣的事情是,如果我先按button1然后按下按钮2,当我点击button2时会显示button1点击生成的数据。 所以似乎doFoo生成的数据在某处缓冲,然后在按下button2后推送到列表框。 编辑: 我尝试将AddNumber添加到表单代码中,并在listBox1.InvokeRequired返回true时添加对Invoke的调用。 这解决了问题,但不是最好的设计。 我不希望GUI必须“担心”如何将项添加到模型的一部分列表中。 如何在添加到列表类内部列表的同时保持逻辑,同时在列表更改时仍然更新gui? 编辑2: 现在我们已经确认这是一个线程问题,我已经更新了图像,以更接近地反映我正在处理的实际代码的设计。 虽然Lucero的建议仍然解决了这个问题,但我希望能找到一些不需要表格来了解dll或CDllWrapper的东西。 模型(ListBoxDataBindingSource等)应该对视图一无所知(列表框,按钮,标签等)