Tag: multithreading

在不阻塞主线程的情况下执行长时间运行的UI更改

无论如何在没有影响C#winforms应用程序中的主线程的情况下运行大量UI更新? 当用户点击某个特定事件时,我希望避免长时间的延迟(在我的情况下,这是一个非常接近forms的处理内存的调用) 我知道我可以使用BackgroundWorker在“do work”事件中执行冗长的操作,但问题是你不能在这个事件中更改任何UI(它会导致交叉线程exception) – 所以我不能把我的大量关闭在这里打电话。 而且我不能将关闭forms调用放在“工作完成”事件中,因为这是在主线程上运行的,并且最终将锁定主线程导致糟糕的用户体验。 我已经考虑过只在应用程序会话空闲时才产生一个处理关闭的线程,但不确定这是否会有点混乱。

在线程之间传递数据

我有以下代码,其中我正在尝试处理大量数据,并更新UI。 我使用后台工作者尝试了同样的事情,但我遇到了类似的问题。 问题似乎是我正在尝试使用未在新线程上实例化的类(实际错误是当前线程不“拥有”实例)。 我的问题是,是否有一种方法可以在线程之间传递此实例以避免此错误? DataInterfaceClass dataInterfaceClass = new DataInterfaceClass(); private void OutputData(List Data) { progressBar1.Maximum = Data.Count; progressBar1.Minimum = 1; progressBar1.Value = 1; foreach (MyResult res in Data) { // Add data to listview UpdateStatus(“Processing”, res.Name); foreach (KeyValuePair dets in res.Details) { ThreadPool.QueueUserWorkItem((o) => { // Get large amount of data from DB based on […]

并行请求刮取网站的多个页面

我想用一个包含大量有趣数据页面的网站,但由于源非常大,我想multithreading并限制过载。 我使用Parallel.ForEach来启动10个任务的每个块,然后在main for循环中等待,直到活动线程的数量开始下降到阈值以下。 为此我使用活动线程的计数器,我在使用WebClient启动新线程时递增,并在触发WebClient的DownloadStringCompleted事件时递减。 最初的问题是如何使用DownloadStringTaskAsync而不是DownloadString并等待Parallel.ForEach启动的每个线程都已完成。 这已通过一种解决方法解决:主要foor循环中的计数器( activeThreads )和Thread.Sleep 。 使用await DownloadStringTaskAsync而不是DownloadString应该通过在等待DownloadString数据到达时释放线程来提高速度吗? 回到原来的问题,是否有办法更优雅地使用TPL,而没有涉及计数器的解决方法? private static volatile int activeThreads = 0; public static void RecordData() { var nbThreads = 10; var source = db.ListOfUrls; // Thousands urls var iterations = source.Length / groupSize; for (int i = 0; i RecordUri(item)); //I want to wait here until process […]

如何使用C#同时读/写表格文件?

我创建了多个服务器。每个服务器都必须将一些数据发送到自己的客户端。 我正在使用TCP / IP协议。 为防止因客户端断开连接而导致数据丢失,我使用文本文件作为缓冲区。 所以在程序中,每个服务器都有一个线程,它继续检查客户端是否连接。 如果它已连接,则它从缓冲区读取并将其发送到客户端。 每当必须将一些新数据发送到客户端时,我首先检查客户端是否已连接。如果客户端未连接,则我将数据写入相同的缓冲区文本文件。 我面临的问题是,当线程从中读取文件时,我无法写入文件。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace WindowsFormsApplication1 { public class TcpIp { public int machinePort; public static int port1 = 1024; public static int count = 0; public string bufferName; FileStream […]

父母的线程死亡后儿童线程会死吗?

我正在研究一个multithreading程序,我不确定这一点。

在c#中使用线程读取COM端口

我想要一些关于线程的建议,因为我是新手。 我在线阅读了几篇关于线程的文章。 我在读com端口数据。 我想使用线程,以便它每5秒读取一次数据并更新列表框中的数据。 目前,正在读取所有数据。 我不确定从哪里开始。 我应该从哪里开始我的线程代码? 我正在使用Windows Form,c#VS2008。 这是我从com端口读取数据的代码: void datareceived(object sender, SerialDataReceivedEventArgs e) { myDelegate d = new myDelegate(update); listBox1.Invoke(d, new object[] { }); } public void update() { while (serialPortN.BytesToRead > 0) bBuffer.Add((byte)serialPortN.ReadByte()); ProcessBuffer(bBuffer); } private void ProcessBuffer(List bBuffer) { int numberOfBytesToRead = 125; if (bBuffer.Count >= numberOfBytesToRead) { listBox1.Items.Add(“SP: ” + […]

C#Threading Bitmap对象/ PictureBox

我有一些代码可以显示移动点的video图形。 我正在将点写入位图,并将其放在图片框上。 图形计算必须在自己的线程上完成。 只要你不“太多”移动窗口,图形就可以正常工作。 我正在使用winforms。 当我运行代码,然后疯狂地移动窗口时,我有时会遇到以下错误: @ this.Invoke(d,new object [] {bmp}); “无法访问已处置的对象。对象名称:’Form1’。” @gfx.DrawImage(bmpDestination,new Point()); “对象目前正在其他地方使用。” 这是代码: private void button2_Click(object sender, EventArgs e) { Thread demoThread = new Thread(new ThreadStart(ThreadProcSafe)); demoThread.Start(); } private void ThreadProcSafe() { creategraphics(); } private void creategraphics() { Bitmap bmpDestination = new Bitmap(988, 588); Bitmap bmp = new Bitmap(988, 588); for (int […]

ipc使用Shared和全局MMF

使用MMF和C#我在2个进程之间创建了一个共享内存。 我的目标是将其创建为全局说长度为4000字节并创建分区 所以Main proj是“MainProj”将启动MMF名为”$AppName$_sharedMMF” 那么“Debugger Proj”将访问”$AppName$_sharedMMF”因此访问者位置是: MainProj->Debugger : readAddr = 0 , writeAddr = 250 Debbugger->MainProj : reafAddr = 250, writeAddr = 0 然后我解决方案中的第三个可执行文件将是 //setter getter MainProj->AnotherExe : readAddr = 251 , writeAddr = 500 //setter getter EnotherExe->MainProj : reafAddr = 500, writeAddr = 251 我面临的问题是,我希望mainProj成为MMF的全局实例 所以每次我想访问分区我都会使用相同的静态类和方法 //accessed by main project SharedSetter(SelectedGetter, Data) 1)因为它由多个线程共享它有点复杂,虽然添加分区并不像整个设置那样复杂,这是一个坏主意吗? 2)我是否真的不能跳过mmf的创建新实例步骤并将其保留为“Alive”并仅创建新的访问器? […]

安全地从线程中提升事件

我在从非UI线程中引发事件时遇到一些问题,因为我不希望在Form1中添加到线程的每个事件处理程序上处理If me.invokerequired。 我确信我已经在某处阅读了如何使用委托事件(在SO上),但我无法找到它。 Public Class Form1 Private WithEvents _to As New ThreadedOperation Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click _to.start() End Sub Private Sub _to_SomthingHappend(ByVal result As Integer) Handles _to.SomthingHappend TextBox.Text = result.ToString //cross thread exception here End Sub End Class Public Class ThreadedOperation Public Event SomthingHappend(ByVal result As Integer) […]

通过工作线程的异步接口使用WCF服务,如何确保从客户端“按顺序”发送事件

我正在编写一个Silverlight类库来抽象到WCF服务的接口。 WCF服务提供集中式日志记录服务。 Silverlight类库为日志记录提供了简化的类似log4net的接口(logger.Info,logger.Warn等)。 从类库我计划提供选项,以便记录的消息可以在客户端上累积并以“突发”forms发送到WCF日志记录服务,而不是在发生时发送每条消息。 一般来说,这很有效。 类库确实累积了消息,它确实将消息集合发送到WCF日志记录服务,在这里它们由底层日志记录框架记录。 我目前的问题是消息(来自具有单个线程的单个客户端 – 所有日志记录代码都在按钮单击事件中)在日志服务中变得交错。 我意识到至少部分原因可能是由于WCF日志服务的实例化(PerCall)或同步。 但是,似乎我的消息发生得如此迅速,以至于异步调用中留下的消息的“爆发”实际上是以与生成它们不同的顺序“离开”客户端。 我试图设置一个生产者消费者队列,如此处所描述的那样稍微(或应该是“轻微的”空中引号)改变Work方法阻塞(WaitOne)直到异步调用返回(即直到执行异步回调) 。 这个想法是当一个消息突发发送到WCF日志记录服务时,队列应该等到该突发被处理后才发送下一个突发。 也许我想做的事情是不可行的,或者我正在努力解决错误的问题,(或者我可能只是不知道我在做什么!)。 无论如何,这是我的生产者/消费者队列代码: internal class ProducerConsumerQueue : IDisposable { EventWaitHandle wh = new AutoResetEvent(false); Thread worker; readonly object locker = new object(); Queue<ObservableCollection> logEventQueue = new Queue<ObservableCollection>(); LoggingService.ILoggingService loggingService; internal ProducerConsumerQueue(LoggingService.ILoggingService loggingService) { this.loggingService = loggingService; worker = new Thread(Work); worker.Start(); } […]