Tag: multithreading

Invoke如何在下面工作? 线程只有1个指令指针吗?

我想知道C#Invoke函数是如何工作的(我正在考虑从工作线程调用一个从GUI线程调用GUI的方法): 假设我有两个线程,每个线程都有它的指针指针,指向当前执行的指令。 现在,我在工作线程中调用Invoke来在GUI线程中运行委托。 当GUI线程已经拥有它的指令指针(IP),并且每个线程只能有一个时,这怎么可能? 当我突然调用我的代码时,该IP会发生什么? 那么如何使GUI线程继续处理它正在做的事情(它的以前的IP以某种方式恢复)? 这个问题的概括是,当我想从线程1调用函数f()时,如何在一些其他线程的上下文中执行f()… 谢谢你的启示:)!

UI Thread .Invoke()导致句柄泄漏?

在什么情况下,在使用委托和.InvokeRequired时,从非UI线程更新UI控件可能会导致进程的句柄不断增加? 例如: public delegate void DelegateUIUpdate(); private void UIUpdate() { if (someControl.InvokeRequired) { someControl.Invoke(new DelegateUIUpdate(UIUpdate)); return; } // do something with someControl } 当在循环或定时器间隔中调用此方法时,程序的句柄会不断增加。 编辑: 如果以上内容被注释掉并修改如下: public delegate void DelegateUIUpdate(); private void UIUpdate() { //if (someControl.InvokeRequired) //{ // someControl.Invoke(new DelegateUIUpdate(UIUpdate)); // return; //} CheckForIllegalCrossThreadCalls = false; // do something with someControl } …然后句柄停止递增,当然我不想允许跨线程调用。 编辑2: 这是一个显示句柄增加的示例: […]

我在Windows窗体中的跨线程调用有什么问题?

我遇到Windows窗体应用程序的问题。 必须从另一个线程显示一个表单。 所以在表单类中,我有以下代码: private delegate void DisplayDialogCallback(); public void DisplayDialog() { if (this.InvokeRequired) { this.Invoke(new DisplayDialogCallback(DisplayDialog)); } else { this.ShowDialog(); } } 现在,每次运行它时,都会在this.ShowDialog();行上抛出InvalidOperationException this.ShowDialog(); : “跨线程操作无效:控制’SampleForm’从其创建的线程以外的线程访问。” 这段代码出了什么问题? 这不是一种有效的跨线程调用方式吗? ShowDialog()有什么特别之处吗?

非阻塞锁定

我想为一个重复操作开始一些新的线程。 但是当这样的操作已经在进行中时,我想丢弃当前的任务。 在我的场景中,我只需要非常新的数据 – 丢弃的数据不是问题。 在MSDN中我找到了Mutex类,但据我所知,它等待轮到它,阻塞当前线程。 另外我想问你: .NET框架中是否存在某些东西,它会执行以下操作 : 某些方法M是否已被执行? 如果是这样, return (并让我增加一些统计计数器) 如果没有,请在新线程中启动方法M.

如何确定线程运行的CPU?

有没有办法确定给定线程在哪个CPU上运行? 最好是在C#中,但C ++会这样做。 .NET Process和ProcessThread类似乎不提供此信息。 ETA澄清: 我们正在开发一个服务器应用程序,用于处理http多播流并生成多个video编码器。 它在具有12个物理内核的系统上运行,从而产生24个逻辑CPU(超线程)。 通过TaskManager和ProcessExplorer,我们validation了我们生成的进程在逻辑CPU上均匀分布。 但是,我们在一个CPU上看到很多(内核?)活动,这些活动因占用不寻常的CPU时间而产生干扰。 我们正在尝试确定在此特定CPU上运行的进程/线程。 TaskManager和ProcessExplorer似乎都没有提供这些信息。 如果他们这样做,请说明如何获得这些信息。 否则,我们正在考虑编写自己的工具来获取此信息。 这就是我们需要帮助的地方。 我们知道如何更改线程亲缘关系(我们知道无法保证线程将保持与任何CPU关联,尽管在这种特殊情况下,占用CPU的线程仍然只与一个CPU相关联),但是为了做到这一点,我们需要首先确定需要重新定位WHICH进程/线程。 这是这个问题的唯一目标。 我希望这有助于澄清问题。

我的异步任务总是阻止UI

在WPF 4.5应用程序中,我不明白为什么在使用await + a task时UI被阻止: private async void Button_Click(object sender, RoutedEventArgs e) { // Task.Delay works great //await Task.Delay(5000); double value = await JobAsync(25.0); MessageBox.Show(“finished : ” + value.ToString()); } private async Task JobAsync(double value) { for (int i = 0; i < 30000000; i++) value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); return value; } await Task.Delay运行良好,但等待JobAsync阻止UI。 为什么? […]

什么是调度员

任何人都可以解释调度员的概念,是每个线程或其他任何一个调度员

静态代码如何与多个线程一起运行?

我正在使用静态和非静态方法从类中读取线程 ,我处于类似情况。 我有一个静态方法,从资源中提取数据并根据数据创建一些运行时对象。 static class Worker{ public static MyObject DoWork(string filename){ MyObject mo = new MyObject(); // … does some work return mo; } } 该方法需要一段时间(在这种情况下,它读取5-10mb文件)并返回一个对象。 我想采用这种方法并在multithreading情况下使用它,这样我就可以一次读取多个文件。 抛开设计问题/指南,multithreading如何访问此代码? 假设我有类似的东西…… class ThreadedWorker { public void Run() { Thread t = new Thread(OnRun); t.Start(); } void OnRun() { MyObject mo = Worker.DoWork(“somefilename”); mo.WriteToConsole(); } } 是否为每个线程运行静态方法,允许并行执行?

C#在任务中更新UI

我是C# Task和线程的新手。 我有一个如下代码: – public void UpdateSales(object sender, EventArgs args) { Task.Run(() => { // Some code Create Collection … // Some code with business logic .. // Below code is to update UI // is it safe to update UI like below saleDataGrid.Dispatcher.Invoke((Action) (() => { saleDataGrid.ItemsSource = currentCollection; saleDataGrid.Items.Refresh(); })); }); } 我不确定这段代码是否正确。 […]

通过单独的任务更新BindingSource中的元素

我有一个class,比如说人,有一个Id和一个名字。 该类正确实现了INotifyPropertyChanged 另外:有人要求上课人。 我真正的问题是一个更复杂的课程,我把它简化为一个相当简单的POCO,以确定它不是因为我的课程。 本来: public class Person { public int Id {get; set;} public string Name {get; set;} } 对于更新,它需要实现INofityChanged。 完整的代码就在这个问题的最后 StackOverflow:如何正确实现INotifyPropertyChanged 我有一个System.Windows.Forms.Form 此表单有一个BindingSource。 绑定源的DataSource属性设置为我的类Person 我有一个绑定到BindingSource的DataGridView 我已经为绑定源添加了几个Person实例 添加的人员被正确显示。 如果我以编程方式更改bindingsource中的Person,则会正确显示更改的值。 到现在为止还挺好。 如果在单独的线程中更改Person,则会出现问题。 我经常收到带有消息的InvalidOperationException BindingSource不能是自己的数据源。 不要将DataSource和DataMember属性设置为引用BindingSource的值。 我想这与更新是在一个等待的异步任务中完成的事实有关。 我知道在更新用户界面项之前,您应该检查InvokeRequired是否相应地采取行动。 private void OnGuiItemChanged() { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { OnGuiItemChanged(); })); } else { … // […]