Tag: multithreading

关于使用RFID进行C#线程的问题

我的问题是关于确保我采取正确方法并正确处理线程的反馈。 我有一种感觉,我可能需要设置一些自己的线程,所以欢迎所有反馈。 我遇到的问题是从零个或多个RFID阅读器读取RFID标签。 我可以在没有问题的情况下阅读单个读者,因此从几个读取不会是一个问题。 读者阅读的每个标签或批次标签都由.Net事件提供。 我的计划是设置一个ReaderControl类,它维护读者,连接,启动,停止等。这个类将听取读者的TagRead事件。 它处理的每个事件(大约每250毫秒)它将读取标记ID(一个字符串)放入一个HashSet以保持它们的唯一性,HashSet位于ReaderControl中。 ReaderControl将包含一个计时器,每500ms触发一次,这个TimerElapsed事件由ReaderControl处理,它将打包从目前为止从所有读取器读取的标签并引发TagsRead事件。 这样做的目的是将事件触发保持在最低限度并减少重复标记。 TagsReads事件由另一个名为TagTranslator的类处理。 这个类将遍历标记ids(字符串)并计算出标记引用的内容,即IPerson对象。 此课程将在完成翻译时使用PeopleSeen事件触发事件。 PeopleSeen事件由GUI中的模型(MVP模式)处理。 总体思路是GUI显示屏显示通过RFID阅读器的人的名字。 显示器很简单,但显然在引擎盖标签正在asych中读取并被转换为“真实”对象以进行显示。 你认为ReaderControl应该在自己的线程上运行,我认为它应该。 我如何在自己的线程中打包这个类,无论GUI在做什么,都只是继续阅读标签。 另外,您认为TagTranslator在处理事件时应该创建线程来处理翻译。

如何在Winform中使用multithreading?

我是multithreading的新手。 我有一个带有标签和进度条的winform。 我想显示处理结果。 首先,我使用Application.DoEvents()方法。 但是,我发现表格很冷。 然后我在MSDN上阅读了一些关于multithreading的文章。 其次,我使用BackgroundWorker来做到这一点。 this.bwForm.DoWork += (o, arg) => { DoConvert(); }; this.bwForm.RunWorkerAsync(); 表格不会冻结,我可以在处理时拖动/ drog。 不幸的是,它会抛出InvalidOperationException。 所以我必须使用它。 Control.CheckForIllegalCrossThreadCalls = false; 我确保这不是最终的解决方案。 专家,您有什么建议吗? 编辑:当我调用listview时抛出InvalidOperationException。 此代码位于DoWork()中。 foreach (ListViewItem item in this.listView1.Items) { //……..some operation lbFilesCount.Text = string.Format(“{0} files”, listView1.Items.Count); progressBar1.Value++; } Edit2:我在DoWork()中使用委托和调用,它不会抛出exception。 但forms再次冻结。 怎么做才能使表格在处理时可以放置/悬垂?

你如何等待网络流来读取数据?

我的应用程序中有一个工作线程,负责三个不同的事情。 在我编写的队列中,有两个作业的请求出现,另一个作业在网络流上出现请求时被激活。 我希望我的工作线程在没有工作要做的时候等待。 这两个队列很容易,因为它们暴露了一个在有​​项目时设置的ManualResetEvent,但是NetworkStream似乎没有这个。 已从TcpClient检索NetworkStream。 我所追求的是看起来像这样的代码: while (notDone) { WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStream.HasData } ); // … if (netStream.DataAvailable) { netStream.Read(buffer, 0, 20); // process buffer } } 有没有人知道获取NetworkStream有数据时设置的WaitHandle的方法?

考虑到使用Task.Run异步运行任何方法的能力,.Net Framework中的* Async方法的目的是什么?

简短的问题: 为什么.Net Framework添加了很多* Async版本的方法而不是开发人员只是使用Task.Run来异步运行同步方法? 详细问题: 我理解异步性的概念。 我知道Tasks 我知道async / await关键字。 我知道.Net Framework中的* Async方法有什么用。 我不明白的是库中* Async方法的目的。 假设您有两行代码: F1(); F2(); 关于数据/控制流程,只有两种情况: F1完成后需要执行F2 。 F2不需要等待F1完成。 我没有看到任何其他情况。 我没有看到任何一般需要知道执行某些function的具体线程(除了UI)。 线程中代码的基本执行模式是同步的。 并行性需要多个线程。 异步性基于并行性和代码重新排序。 但基地仍然是同步的。 当F1的工作量很小时,差异无关紧要。 但是当A花费大量时间完成时,我们可能需要查看情况,如果F2不需要等待F1完成,我们可以与F2并行运行F1 。 很久以前我们使用线程/线程池来做到这一点。 现在我们有Tasks 。 如果我们想并行运行F1和F2 ,我们可以写: var task1 = Task.Run(F1); F2(); 任务很酷,我们可以在最终需要完成任务的地方使用await 。 到目前为止,我认为没有必要制作F1Async()方法。 现在,我们来看一些特殊情况。 我看到的唯一真正特殊情况是UI。 UI线程是特殊的并且停止它会使UI冻结很糟糕。 正如我所看到的,Microsoft建议我们将UI事件处理程序标记为async 。 将方法标记为async意味着我们可以使用await关键字基本上在另一个线程上调度繁重的处理并释放UI线程,直到处理完成。 我不能再得到的是为什么我们需要任何* Async方法来等待它们。 我们总是可以写await Task.Run(F1); 。 […]

如何更快地运行此entity framework示例

我有这个代码用于向数据库添加大约1500条记录: async void button7_Click(object sender, EventArgs e) { var task = await Task.Run(() => { Random rnd = new Random(); for (int i = 0; i <= 1500; i++) { db.Tbls.Add(new Tbl() { Name = "User" + i + 1, Num = rnd.Next(10, i + 10) / 10 }); progress.Report(i * 100 / 1500); } […]

在线程中的无限循环中,cpu使用率增加到100%

我在ASP.NET Web应用程序中实现了一个基于Web的聊天平台,我使用类似于长轮询的技术。 我的意思是我将来自客户端的每个Web请求保留特定时间段(超时)或直到新消息到达,然后将响应发送到客户端。 我将连接的客户端保留在内存中(字典对象),当有新消息发送到客户端时,我将此消息写入接收方客户端的消息数组中。 客户端需要发送请求以获取自己的消息,并将此请求保存在内存中的数组中。 我正在使用异步http处理程序来监听客户端请求,我将Web请求保存在内存中的数组中。 我使用线程从内存中连续检查新消息(在为每个客户端创建的字典中)。 我不使用.net线程池线程来检查新消息或超时web请求。我创建这样的线程: System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback)); t.IsBackground = false; t.Start(); 在每个线程的QueueCometWaitRequest_WaitCallback方法中,我处于无限循环中: while (true) { … Thread.Sleep(100); } 在这个方法中,我正在检查Web请求超时或每个Web请求的新消息,它也保存在内存中的数组中。 一切都很顺利,直到我注意到CPU使用率达到了100%的时间。 (在第一个连接的客户端之后的几分钟内)在第一个请求开始时,一切似乎都正常,我的意思是在向客户端返回响应时CPU使用率不高于10%。 但即使有2个客户端,CPU使用率也会增加到100%。 只有在写入客户端请求的响应时,CPU使用率似乎是100%。 如果没有客户端,那么一切都恢复正常(CPU使用率约为0%),直到客户端完成新的Web请求。 我不太详细地知道线程,但我怀疑我创建的新线程并且无限地工作。 这就像操作系统因为它们一直在工作而及时为它们提供更多的CPU使用和资源,并且这个Thread.Sleep(100)不起作用。 这是QueueCometWaitRequest_WaitCallback()方法: void QueueCometWaitRequest_WaitCallback() { while (true) { if (processRequest.Length == 0) { Thread.Sleep(100); } else { for (int i = 0; i […]

HttpWebRequest和I / O完成端口

我正在开发一个应用程序,它需要一种类型的消息才能访问数据库,而另一种类型的消息要去一些外部的xml api。 我必须处理A LOT …其中一个重大挑战是让HttpWebRequest类表现良好。 我最初开始只使用标准的同步方法和线程整个事情。 这不好。 因此,经过一些阅读后,我看到推荐的方法是使用Begin / End方法将工作委托给IO完成端口,从而释放线程池并产生更好的性能。 这似乎不是这样的……性能稍微好一些,但我当然看不到与threadpool相比使用的IO完成端口。 我有一个旋转的线程,并向我发送线程池中可用的工作线程+完成端口。 完成端口总是非常低(我看到的最大值是9)并且我总是使用大约120个工作线程(有时更多)。 我对httpwebrequest所有方法使用开始/结束模式: Begin/EndGetRequestStream Begin/EndWrite (Stream) Begin/EndGetResponse Begin/EndRead (Stream) 我做得对吗? 我错过了什么吗? 我可以同时使用(有时)多达2048个http连接(来自netstat输出) – 为什么完成端口号会这么低? 如果有人可以就如何处理这个管理工作线程,完成端口和httpwebrequest提供一些认真的建议,那将非常感激! 编辑:.NET是一个合理的工具吗? 我可以使用.NET和System.Net堆栈获得大量的http连接吗? 有人建议使用类似WinHttp(或其他一些C ++库)的东西,并从.NET中调用它,但这不是我特别想做的事情!

ASP.NETmultithreadingWeb请求

我正在我的ASP.NET解决方案中构建一个页面,该页面从第三方API服务中检索大部分数据。 页面本身需要对API进行大约5次单独的不同调用以填充其所有控件,因为每个API请求都会返回不同的数据集。 我想同时处理我在新线程上发出的每个单独的Web请求,以便减少加载时间。 我正在制作的每个请求都是这样的: – WebRequest request = WebRequest.Create(requestUrl); string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); return new JsonSerializer().Deserialize(new JsonTextReader(new StringReader(response))); 首先,我应该尝试这个吗? 即,它安全吗? 并且它会通过multithreading来提高性能。 其次,这样做的最佳方法是什么? multithreading系统有许多不同的方法,但最适合这项任务的是什么?

如何抑制thread.abort()错误C#?

我的程序加载时,我在后台线程上显示启动画面。 一旦加载我就会中止线程,因为它的唯一目的是显示一个正在加载的启动表单。 我的问题是,当中止一个Thread时,它会抛出一个ThreadAbortException ,用户只需单击Continue on。 我该如何处理? 我试图压制它 – > try { Program.splashThread.Abort(); } catch(Exception ex) { } 但我有一种感觉,这会让我在这里大吼大叫,它无论如何都行不通。 谢谢!

WPF附加文本阻止UI线程,但WinForms没有?

我最近将我的应用程序从WinForms转换为WPF,我对大多数新function感到满意。 然而,我遇到了一个重要的绊脚石。 当我不断地将文本附加到我的文本框时,UI线程变得如此封闭,以至于我无法做任何事情,只是看它附加文本! 我需要能够在我的选项卡控件,单击按钮等等中切换选项卡。奇怪的是,我在WinForms的UI线程中绝对没有减速! 所以,这里有一个关于我的应用程序的背景:它将其他进程作为“动作队列”的一部分运行,并将这些进程的stdout和stderr吐出到两个单独的文本框中,以及日志文本框(这些是受影响的文本框)。 在低输出进程中,没有减速,但是当我使用SVN checkout和文件复制等进程时,我会立即获得大量文本输出,它只能附加文本。 这是我的打印代码: public void PrintOutput(String s) { String text = s + Environment.NewLine; Window.Dispatcher.Invoke(new StringArgDelegate(Window.PrintOutput), text); Debug.Log(“d ” + text); } public void PrintLog(String s) { ClearLogButtonEnabled = true; String text = s + Environment.NewLine; Window.Dispatcher.Invoke(new StringArgDelegate(Window.PrintLog), text); } 和匹配的代码隐藏: public void PrintOutput(String s) { outputTextBox.AppendText(s); outputTextBox.ScrollToEnd(); if (!clearOutputButton.IsEnabled) […]