Tag: multithreading

C#中的跨进程锁定

我编写了一个API,将在(1)Windows服务,(2)Web应用程序和(3)Windows窗体应用程序的同一个框中使用。 他们都需要共享一小组常用数据(一些int,一个日期和一个字符串,我可以将其作为单个类的属性)。 我可以使用哪种锁定机制进行跨进程,以便三个进程可以安全地共享资源而不会遇到冲突? 请不要数据库,寻找不需要额外依赖性的解决方案。 优选地,解决方案将以某种方式使用共享存储器或文件系统。

如何在多个线程的单个文件中写入?

我在C#中创建Windows应用程序,我想用多个线程编写多个文件。 我从不同的端口获取数据,并且每个端口都有一个文件。 是否有可能为每个端口创建线程并一次又一次地使用相同的线程将数据写入相应的文件? 假设我从端口10000,10001,10002获取数据,并且有三个文件,如10000.txt,10001.txt和10002.txt。 我必须分别创建三个线程来将数据写入这三个文件,我想一次又一次地使用这些线程。 可能吗? 如果可能,请您提供一小段代码吗?

c#等待一段时间而不阻塞

我希望我的方法等待大约500毫秒,然后检查是否有一些标志已经改变。 如何在不阻止我的其他应用程序的情况下完成此操作?

取消后台工作者

我有UI显示长时间运行的状态(从ftp下载一些文本文件)。 为了我的目的,我使用backgroundworker,我无法取消操作。 void worker_DoWork( object sender, DoWorkEventArgs e ) { try { int rowIndex = (int)e.Argument; //begin UI update StartWaitingBar(rowIndex); //get provider id cell GridViewDataRowInfo row = _proivderGridView.Rows[rowIndex]; GridViewCellInfo provIdCell = row.Cells[ “ProviderId” ]; var providerData = GetProviderData(Convert.ToInt32( provIdCell.Value)); var provider = ProviderFactory.CreateProvider(providerData); provider.Synchronize(); e.Result = rowIndex; } catch (Exception exception) { return; } } […]

FileSystemWatcher是否创建自己的线程?

我希望这项工作在不同的线程中完成,但我是否必须创建一个线程或者它是否在不同的线程上完成所有工作? 喜欢: Thread fileThread = new Thread(() => { FileWatcher = new FileSystemWatcher(); FileWatcher.Created += OnFileEvent; FileWatcher.Deleted += OnFileEvent; FileWatcher.Renamed += OnRenameEvent; FileWatcher.EnableRaisingEvents = true; }); fileThread.Start();

缺少非捕获Task.Yield迫使我使用Task.Run,​​为什么要这样做呢?

如果这个问题是基于意见的,请提前道歉。 这里已经讨论了缺少不捕获执行上下文的Task.Yield版本。 显然,此function在早期版本的Async CTP中以某种forms出现,但由于它很容易被滥用而被删除 。 IMO,这样的function可能像Task.Run本身一样容易被滥用。 这就是我的意思。 想象一下,有一个等待的SwitchContext.Yield API来调度ThreadPool上的延续,因此执行将始终在与调用线程不同的线程上继续。 我可以在下面的代码中使用它,它从UI线程启动一些CPU绑定的工作。 我认为这是一种在池线程上继续CPU绑定工作的便捷方式: class Worker { static void Log(string format, params object[] args) { Debug.WriteLine(“{0}: {1}”, Thread.CurrentThread.ManagedThreadId, String.Format(format, args)); } public async Task UIAction() { // UI Thread Log(“UIAction”); // start the CPU-bound work var cts = new CancellationTokenSource(5000); var workTask = DoWorkAsync(cts.Token); // possibly await for […]

记录每个单独线程的单个日志文件

我有一个服务应用程序,它在启动时读取XML文件并为XML文件中的每个条目启动一个线程。 每个线程都创建一个worker类的实例,该实例需要记录器将任何输出记录到特定于线程的日志文件中。 在服务app.config中,我将log4net配置设置设置为使用XML appender,并将文件指定为PatternString,如下所示: 在创建的worker类的每个实例的线程锁定方法中,我使用log4net.LogManager.GetLogger(“MyLogger”)方法获取记录器,然后使用ThreadContext.Properties[“LogName”] = “Log name prefix”设置当前线程PatternStrings LogName属性ThreadContext.Properties[“LogName”] = “Log name prefix” 。 所有文件都已创建,但是当调用记录器时,它只会将所有消息记录到一个看似随机的文件中。 我已经搜索了很长一段时间试图找到一个解决方案或一些我做错的答案,但我没有运气。 有谁知道为什么会这样?

在线程中访问UI

当我尝试更改UI属性(特别是启用)时,我的线程抛出System.Threading.ThreadAbortException 我如何访问线程中的UI。

半围栏和全围栏?

我一直在读Full fences防止任何类型的指令重新排序或缓存围栏(通过memoryBarrier) 然后我读到了关于volatile产生“半栅栏”: volatile关键字指示编译器在每次从该字段读取时生成一个获取栅栏,并在每次写入该字段时生成一个释放栅栏。 收购围栏 获取栅栏可防止其他读/写在栅栏之前移动; 发布围栏 释放栅栏可防止在栅栏后移动其他读/写。 有人可以用简单的英语向我解释这两句话吗? (围栏在哪里?) 编辑 在这里得到一些答案之后 – 我已经制作了一幅可以帮助每个人的图画 – 我想。 http://i.stack.imgur.com/A5F7P.jpg

WPF / C中的线程和集合修改#

我正在开发一个C#/ WPF系统,它访问一个SQL数据库,检索一些数据(大约10000个项目),然后应该更新一个数据点集合,用作我在我的应用程序中使用的WPF图表的数据(Visifire图表解决方案,万一有人想知道)。 当我编写直接的单线程解决方案时,系统会像您预期的那样挂起应用程序查询数据库,检索数据和呈现图表所花费的时间。 但是,我想通过在使用multithreading获取和处理数据时向用户添加等待动画来更快地完成此任务。 但是,出现了两个问题: 在使用multithreading时,我无法更新我的集合并使它们保持同步。 我对Dispatcher课程不太熟悉,所以我不太清楚该怎么做。 由于我显然没有很好地处理multithreading,因此等待动画不会显示(因为UI被冻结)。 我想弄清楚是否有一种很好的方法可以有效地使用multithreading进行收集。 我发现微软有线程安全的collections,但似乎没有一个符合我的需求。 此外,如果有人有一个很好的参考来学习和理解Dispatcher我会非常感激。 编辑:这是我正在尝试做的代码片段,也许它可以解释我的问题: private List InitializeDataSeries(RecentlyPrintedItemViewModel item) { var localDataPoints = new List(); // Stopping condition for recursion – if we’ve hit a childless (roll) item if (item.Children.Count == 0) { // Populate DataPoints and return it as one DataSeries _dataPoints.AddRange(InitializeDataPoints(item)); } else { // Iterate […]