Tag: multithreading

滚动时通过线程更新DataGridView

我遇到了我的这个问题,如果有人解决了这个问题,那将会很有帮助 我的问题 我想做的是: 1)在表单加载事件中初始化DataTable数据表并将其defaultview分配给a datagridview dgvresult 2)点击一个按钮启动一个STA线程(我实际上正在使用WatIN IE,因此 需要使线程STA)调用一个创建相同DataTable的方法 dt作为在步骤1中创建的数据表,然后向此数据表添加300行。 3)调用一个委托,它将这个dt与datatable合并,从而更新dgvresult这里是我的问题: 这是我刚才描述的步骤的代码片段: static class Program { /// /// The main entry point for the application.This method is made STAThread as I need to intialize WatIN IE in the form load of frmMain /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); } } /// […]

在监听消耗IEnumerable 时,Blocking.Peek()的类似于BlockingCollection

我正在使用Pipelines模式实现来将消费者与生产者分离,以避免缓慢的消费者问题。 如果在消息处理阶段[1]上有任何exception,它将丢失并且不会被分派到其他服务/层[2] 。 我怎样才能在[3]处理这样的问题,所以信息不会丢失,重要的是什么! 消息的顺序不会混淆,因此上层服务/层将按照它们进入的顺序获取消息。我有一个想法涉及其他中间Queue但它看起来很复杂? 不幸的是, BlockingCollection没有暴露Queue.Peek()方法的任何模拟,所以我只能读取下一个可用的消息,并且在成功处理的情况下执行Dequeue() private BlockingCollection messagesQueue; // TPL Task does following: // Listen to new messages and as soon as any comes in – process it foreach (var cachedMessage in messagesQueue.GetConsumingEnumerable(cancellation)) { const int maxRetries = 3; int retriesCounter = 0; bool isSent = false; // On this point a message […]

multithreading比单线程慢

我有以下代码(控制台应用程序的’Program.cs’的完整内容)。 ‘countUp’直到’countUp4’的单线程执行需要13秒,multithreading执行21秒。 我有一个Intel Core i5-2400 @ 3.10 GHz,8 GB Ram,Windows 7 64 Bit。 那么为什么mutli线程执行比单线程执行慢? multithreading对于不阻塞简单c#应用程序的主程序有用吗? multithreading什么时候给我一个执行速度的优势? using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static int counter = 0; static int counter2 = 0; static int counter3 = 0; static int counter4 = 0; static void Main(string[] […]

C#类库的线程本地存储

我有一个非常古老但非常大的库,我正在考虑转换为C#类库。 现有库使用存储在TLS中的许多全局变量。 C#没有真正的全局变量概念,但一种解决方法是使用一个名为GlobalVar的静态类,并将它们全部放在这个类中,以便可以通过GlobalVar.xxxxxx访问它们 但是,我的想法是,这会破坏所有正在转换的现有代码,因为GlobalVar类将是一个普通的全局类而不是每个线程存储。 有没有办法让每个线程的这些全局变量? 即C#中__declspec(thread)静态的等价物是什么? 我应该补充一点,我讨厌全局变量。 我认为它们往往是设计不佳的结果。 但是,由于严格的时间限制,第一阶段是将库转换为C#,最小化,然后第2阶段将重新设计它们。

为什么要使用ThreadStart?

有人可以澄清我们使用ThreadStart的原因吗? new Thread (new ThreadStart (Update)).Start(); -Versus- new Thread (Update).Start(); // Seems more straightforward private void Update() { }

什么.NET 4.0 System.Collections.Concurrent集合在function中添加到.NET 3.0 SynchronizedCollection?

.NET 4.0引入了System.Collections.Concurrent命名空间: “ System.Collections.Concurrent命名空间提供了几个线程安全的集合类,每当多个线程同时访问集合时,应该使用它们代替System.Collections和System.Collections.Generic命名空间中的相应类型” BlockingCollection类 ConcurrentBag类 ConcurrentQueue类 ConcurrentDictionary类 OrderablePartitioner类 Partitioner类 IProducerConsumerCollection接口 SynchronizedCollection类(自.NET 3.0起可用): “提供一个线程安全的集合,其中包含generics参数指定的类型的对象作为元素” …位于System.Collections.Generic命名空间中。 那么,为什么SynchronizedCollection类是线程安全的而不是并发的? 具体是什么使SynchronizedCollectiongenerics类与System.Collections.Concurrent集合不同且不兼容? 更新:让我重新解释一个问题:属于System.Collections.Concurrent命名空间的所有generics集合中的共同点和区分新特性是什么,它在SynchronizedCollectiongenerics类中不存在(并且在使用时不可能)? 我将标题更改为“.NET 4.0 System.Collections.Concurrent集合在function中添加到.NET 3.0 SynchronizedCollection ?”。 但大多数情况下,我很想知道是什么让它无法在.NET 3.0的基础上进行 Update2 :关于说明: “这个问题可能已经有了答案: SynchronizedCollection和其他并发集合有什么区别? “ 答案是在我的问题的背景下混淆 – 新function是进化的(使用预4.0版function)还是革命性的(在.NET 4.0之前不可用)?

什么决定了TaskFactory衍生作业的线程数?

我有以下代码: var factory = new TaskFactory(); for (int i = 0; i foo(i1)); } static void foo(int i) { Thread.Sleep(1000); Console.WriteLine($”foo{i} – on thread {Thread.CurrentThread.ManagedThreadId}”); } 我可以看到它一次只做4个线程(基于观察)。 我的问题: 什么决定了一次使用的线程数? 我该如何找回这个号码? 我该如何更改此号码? PS我的盒子有4个核心。 PPS我需要具有特定数量的任务(而不是更多)由TPL同时处理并最终得到以下代码: private static int count = 0; // keep track of how many concurrent tasks are running private static void SemaphoreImplementation() { var […]

使用Task.Factory.StartNew新创建的线程启动非常缓慢

在使用Task.Factory.StartNew创建的大约50-200个短生存工作线程的WPF / c#应用程序中,在新创建的线程开始执行之前需要1到10秒。 这个非常慢的线程执行开始的原因是什么? 更新:延迟是500毫秒

必须在与DependencyObject相同的Thread上创建DependencySource

我有一个用wpf编写的应用程序,它可以下载一些网页,解析HTML代码并保存一些值。 class ListOfItems { public List ListToBind; public void DownloadItems() { Task.Factory.StartNew(() => { … … if (OnDownloadCompleted != null) OnDownloadCompleted(this, EventArgs.Empty); } } } class SomeObject { public string NameOfItem; public MyClass Properties; } class MyClass { public int Percentage; public SolidColorBrush Color; } 这是我正在使用的对象模型。 它是简化版本,我不希望你重新组织它,我有这样写道的原因。 在ListOfItems类中是执行所有工作的方法(内部使用一些其他方法使代码可读) – 下载源代码,使用数据解析和填充ListToBind ,fe [0] => NameOfItem = […]

如何强制取消任务?

假设,有一项任务包含以下约: Task someTask = new Task(() => { while(!IsCancellationRequested) { Do_something_over_a_long_period_of_time(); token.ThrowIfCancellationRequested(); Do_something_over_a_long_period_of_time(); token.ThrowIfCancellationRequested(); Do_something_over_a_long_period_of_time(); token.ThrowIfCancellationRequested(); } }); someTask.Start(); 并且有非常不耐烦的用户。 他们渴望立即终止我的申请。 他们不想等待长时间的行动。 我曾经使用Thread类,并能够通过调用Abort()命令立即中止我的所有线程。 我如何立即中止我的任务? 谢谢。