Tag: multithreading

串口读取+线程还是更好的东西?

我不知道这是否是使用堆栈完成此任务的好方法,但我确信有更快的方法…我从微控制器获取数据但数据长度并不总是相同的长度。 我想也许我可以在我的堆栈中推送数据,在一个线程中我可以弹出它并解码消息。 我不想放慢DataReceivedHandler的速度,然后我创建了一个Thread,它可以弹出数据并将其写入我的decodeMessage()函数中的Listview。 一段时间后,我得到一个System.OutOfMemories例外.. 有什么想法我怎么能以更好的方式做到这一点? 当数据到达时,我正在从我的串口读取: Stack stack = new Stack(); ….. public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; byte[] data = new byte[sp.BytesToRead]; sp.Read(data, 0, data.Length); stack.Push(data); } 这是我的主题: private void formatData() { try { while (true) { byte[] data; int i=0; Dispatcher.BeginInvoke(new Action(() => { while (stack.Count > 0) […]

如何使用Parallel.For / ForEach获得最大性能? (包括性能时间)

我正在尝试并行化我的Web解析工具,但速度增益似乎非常小。 我有i7-2600K(8核超线程)。 这里有一些代码可以向您展示这个想法。 我只展示了Parallel.ForEach但你明白了: List AllLinks = this.GetAllLinks(); ConcurrentDictionary AllTopics = new ConcurrentDictionary ( ); int count = 0; Stopwatch sw = new Stopwatch ( ); sw.Start ( ); Parallel.ForEach ( AllLinks, currentLink => { Topic topic = this.ExtractTopicData ( currentLink ); this.AllTopics.TryAdd ( currentLink, topic ); ++count; if ( count > 50 ) { […]

如何编写PostSharp Invoke方面以简化跨线程控制更新

当我想跨线程更新控件时,我通常最终会这样做: this.Invoke((MethodInvoker)delegate { SomeProcedure(); }); 建议的方法实际上就是调用你想要更新的特定控件的调用者,但99%的时候表单(即我的例子中的’this’)和控件都将在同一个控件上创建线程所以我真的很喜欢这样做,为了简单起见。 我在想,如果我只是将一个PostSharp方面置于SomeProcedure之上,将它包含在我的那个混乱的声明中,这将是很好的。 然后去…(哦是啊,第一个可用的答案100奖金点:)

使用调度程序更新WPF进度条

我正在尝试使用调度程序更新进度条,但不知何故无法考虑将调度程序放在何处。内部以及在其中传递的内容。 我试图导入文件,需要向用户显示使用进度条导入的文件数量。 所以我有一个代表: public delegate void DelegateA(ProgressClass progressClass); 我正在调用委托并传递函数来调用。 DelegateA(FunctionA); 因此,在导入每个文件时,它会调用FunctionA。 private void FunctionA(ProgressClass progressClass) { **//Put dispatcher.invoke here?** progressbar.updateprogress(progressclass); progressbar.show(); } progressclass有两个属性,用于设置进度条的值(已处理的数量)和要处理的项目总数。 我无法理解在InvokeMethod中传递的委托方法(THreadPriority,委托方法)? 对不起,如果有什么不清楚的话。

有没有办法将观察者订阅为异步

给定一个同步观察者,有没有办法做到这一点: observable.SubscribeAsync(observer); 并且observer所有方法都是异步调用的,或者是在创建观察者时我必须处理的东西?

如何在某些任务非常昂贵的任务中加载平衡并行性?

我有一个需要处理的对象列表。 所以说列表是所有客户的列表,我需要对所有客户执行CPU密集型计算。 虽然在此计算之前和之后我需要将数据提取并提交回数据库,因此它不仅仅是一个CPU任务。 所以我做的是 Parallel.ForEach(list, action); 行动在字面上 1 Fetch customer data 2 Process calculate (time and memory intensive task) 3 Commit back customer data 代码过去运行良好,但最近有时当处理了大量记录数量较多的客户时,系统内存不足。 那么有没有办法对此进行负载均衡? 大多数客户都得到了快速处理,但很少有人将所有资源都拿走了。 我可以避免其中一些一起跑吗? 我可以实现这一点的一种方法是根据大小对列表进行排序,然后尝试选择第一个和最后一个项目并自己控制并行性,但是想看看我在这里有哪些选项。

如何实现multithreading并行执行多个任务?

我是线程编程的新手。 我必须在PARALLEL和Background中运行一些任务(以便主UI执行线程保持对用户操作的响应)并等待每个任务完成,然后再继续执行。 就像是: foreach(MyTask t in myTasks) { t.DoSomethinginBackground(); // There could be n number of task, to save // processing time I wish to run each of them // in parallel } // Wait till all tasks complete doing something parallel in background Console.Write(“All tasks Completed. Now we can do further processing”); 我知道可以有几种方法来实现这一目标。 但我正在寻找在.Net […]

如何从CLR线程池而不是ASP.NET池创建ASP.NET页面中的线程?

如果我在ASP.NET页面上创建一个新线程,则IsThreadPoolThread属性为true。 第一个问题是,它来自ASP.NET池还是CLR池? 第二个问题是,如果它是从ASP.NET池那么如何从CLR创建一个线程而不使用ASP.NET池? 我需要一个长期运行请求的同步解决方案( 全文 )。

事件提升和.net 4.5中的阅读介绍

我有与此MSDN杂志文章相关的问题。 阅读简介正如我刚才所解释的,编译器有时会将多个读取融合为一个。 编译器还可以将单个读取拆分为多个读取。 在.NET Framework 4.5中,读取介绍比读取消除要少得多,并且仅在非常罕见的特定情况下发生。 但是,它有时会发生。 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; } } 如果检查PrintObj方法,obj.ToString表达式中的obj值似乎永远不会为null。 但是,该行代码实际上可能会抛出NullReferenceException。 CLR JIT可能会编译PrintObj方法,就好像它是这样编写的: void PrintObj() { if (_obj != […]

C#Metro App UI更新

我的问题和这个链接一样 。 我正在使用C#开发用于Metro应用程序的新WinRT(win8发布预览版)。 问题是:我的应用我的程序在后台运行一个线程,它接收来自服务器的消息(事实上,我移植了一个XMPP客户端应用程序)。 应在UI中更新一些信息。 我试过那个链接。 第二种方法似乎对我有用,但我发现VS2012RC intellisense中没有Dispatcher.Invoke(…) ,这意味着没有这种扩展方法。 仔细搜索后,我想也许这个链接可以帮助我。 但我不知道如何在这种情况下从我的应用程序开始(因为我是C#的初学者)。 你能给我一些建议吗? 如果你展示一些对我有帮助的代码片段,我将不胜感激。 非常感谢。