Tag: multithreading

钩子事件Outlook VSTO在主线程上继续工作

我开发了一个Outlook VSTO插件。 有些任务应该在后台线程上完成。 通常,检查本地数据库中的某些内容或调用Web请求。 在阅读了几篇文章之后,我放弃了在后台线程中调用Outlook对象模型(OOM)的想法。 我有一些wpf控件,我成功地设法使用.NET 40 TPL执行异步任务,并在完成时“完成”主VSTA线程中的作业(即访问UI或OOM)。 为此,我使用以下forms的语法: Task task = Task.Factory.StartNew(()=>{ //Do long tasks that have nothing to do with UI or OOM return SomeResult(); }); //now I need to access the OOM task.ContinueWith((Task tsk) =>{ //Do something clever using SomeResult that uses the OOM },TaskScheduler.FromCurrentSynchronizationContext()); 到现在为止还挺好。 但是现在我想在OOM中挂钩没有Form / WPF控件的事件时做类似的事情。 确切地说,我的问题来自于TaskScheduler.FromCurrentSynchronizationContext()抛出exception的事实。 例如, Items […]

C#I / O Parallelism确实提高了SSD的性能?

我在这里读了一些答案( 例如 ),其中一些人说并行性不会提高性能(可能在读取IO中)。 但我创建了一些测试,表明WRITE操作也更快。 – 阅读测试: 我用伪数据创建了随机6000文件: 让我们尝试用w / o并行性来阅读它们: var files = Directory.GetFiles(“c:\\temp\\2\\”, “*.*”, SearchOption.TopDirectoryOnly).Take(1000).ToList(); var sw = Stopwatch.StartNew(); files.ForEach(f => ReadAllBytes(f).GetHashCode()); sw.ElapsedMilliseconds.Dump(“Run READ- Serial”); sw.Stop(); sw.Restart(); files.AsParallel().ForAll(f => ReadAllBytes(f).GetHashCode()); sw.ElapsedMilliseconds.Dump(“Run READ- Parallel”); sw.Stop(); 结果1: 运行READ- Serial 595 运行READ- Parallel 193 结果2: 运行READ- Serial 316 运行READ-Parallel 192 – 写测试: 要创建1000个随机文件,每个文件为300K。 (我从prev test中清空了目录) var bytes […]

在后台线程中创建元素然后添加到主界面

我在WPF中遇到线程问题。 我想创建一个复杂的用户界面,然后我想将它添加到我的主窗口。 虽然这个复杂的用户界面正在创建,但我希望在主窗口中显示进度条。 我认为这只能通过线程来实现。 但有一个问题。 创建的元素无法添加到主窗口,因为它是在单独的线程中创建的。 有人知道是否有可能将在后台线程中创建的UIElements转移到主线程。 如果我以一种简单的方式尝试,它表示无法访问该对象,因为它位于一个单独的线程中。 我已经使我的进度条线程安全了。 我希望以下示例更好地解释我想要的内容。 StackPanel tcForm = new StackPanel(); Semaphore loadedSema = new Semaphore(0,1); Thread thread = new Thread(new ThreadStart(delegate(){ //Formular should be created in background tcForm.Children.Add(new Formular()); ProgressBar.AddProgress(); //…other things loadedSema.Release(); })); thread.start(); loadedSema.WaitOne(); new Formular()运行了很长时间,所以我想在后台创建。 将Formular添加到变量然后添加主线程也是不可能的。 //this is also impossible //in background-thread form = new Formular //in […]

Word应用程序未在线程或并行进程中关闭

在将docx / doc保存到pdf之后,下面的代码通常可以正常工作并且单词被打开和关闭但是当在线程中使用以下代码或者并行循环它没有时,是否有任何想法? 我已经提供了以下所有代码。 这是函数中使用的代码工作正常。 wordApp = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word.Document wordDocument = wordApp.Documents.Open(sourceFile, false); wordDocument.ExportAsFixedFormat(destFile, WdExportFormat.wdExportFormatPDF); object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges; object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat; object routeDocument = false; if (wordDocument != null) ((_Document)wordDocument).Close(ref saveOption, ref originalFormat, ref routeDocument); if (wordApp != null) ((_Application)wordApp).Quit(ref saveOption, ref originalFormat, ref routeDocument); wordDocument = null; wordApp = null; 下面是我尝试调用上面代码的Parallel.For代码: […]

由C#中的多个线程访问的方法使用Progressbar

我有多个线程访问方法。 该方法在线程执行时更新表单上的进度条。 该方法更新我的Windows窗体上的进度条,显示处理文件的进度,因为线程正在完成它们。 您将如何管理该方法以避免死锁。 我无法锁定它,不知道我是做错了,还是我应该在这种情况下锁定它。 public void myWorkerClass() { int amountToScan = 4; lblcount.BeginInvoke( ((Action)(() => lblcount.Text = “Files Checked ” + atPDFNumber.ToString() + ” of ” + amountToScan.ToString()))); decimal percentageComplete = ((decimal)atPDFNumber / (decimal)amountToScan) * 100; backgroundWorker1.ReportProgress((int)percentageComplete); } 结果是,在最后一行,它告诉我“这个操作已经调用了OperationCompleted,并且进一步的调用是非法的。” 我认为我打开的东西已经被第一个线程或类似的东西处理掉了。 这是一个很好的方法来使用multithreading的进度条(我有正确的想法或原则),或者我的代码中只有一个小错误? 我想如何让这个问题对其他人有价值的是回答这个问题如何在多个线程访问的方法中访问全局变量。 因为我认为这就是这个问题的方向。

寻找一些UI线程和工作线程教程

我的工作环境是VSTS 2008 + C#+ .Net 3.5。 我想了解UI线程和工作线程之间的差异,以及任何其他类型的线程(即非UI线程与工作线程相同)? 我还想了解我们可以对每种类型的线程和最佳实践做些什么的限制,以避免任何问题。 欣赏任何好的教程! 🙂

如何锁定流?

我有2个post: 线程1正在写入流。 并且线程2正在从该流中读取。 我怎样才能在线程2中锁定线程1以免写入? 所以我可以从流中读取? MemoryStream outputStream= new MemoryStream(); 线程1: stream = System.IO.File.OpenRead(fileToSend); compressor.CompressionMethod = SevenZip.CompressionMethod.Lzma2; compressor.CompressionLevel = SevenZip.CompressionLevel.Fast; compressor.CompressStream(stream, outputStream); 我想从线程2中的输出流中读取。我尝试使用lock(outputStream)和outputStream.Lock(0,outputStream.Lengh)并且两者都不会阻止线程1写入它。 我正在使用sevenZipSharp

获取UdpClient在主线程中接收数据

我正在尝试将LAN服务器发现添加到我的Unity游戏中。 我正在使用UDP来广播请求。 如果网络上的任何人是服务器,他们将回复一些服务器数据。 我已经弄清楚了这一部分,但我需要使用一些Unity函数(包括其他自定义monobehaviour脚本)来生成数据包数据。 Unity不允许从主要线程以外的任何线程访问其API。 我正在使用UdpClient.BeginReceive , UdpClient.EndReceive , AsyncCallback流程。 因此接收AsyncCallback函数( AsyncRequestReceiveData的示例脚本中的AsyncRequestReceiveData )在另一个不允许我使用任何Unity函数的线程中运行。 我用flamy的这个答案作为我脚本的基础。 我已经尝试在脚本听到请求时在AsyncRequestReceiveData触发委托和事件,但它似乎在同一个单独的线程中触发。 由单独的线程在主线程中触发的事件可以很好地工作,但我不确定如何做到这一点。 虽然脚本inheritance自MonoBehaviour (Unity 3D中的基础对象),但它应该运行得很好。 脚本的输出应如下所示: 传递请求:requestedServers 收到请求:requesServers 这是准系统脚本: using UnityEngine; using System; using System.Collections; using System.Net; using System.Net.Sockets; public class TestUDP : MonoBehaviour { public delegate void RequestReceivedEventHandler(string message); public event RequestReceivedEventHandler OnRequestReceived; // Use this to trigger the event […]

遍历树时使用线程

我想加快穿越树的过程。 以下是节点的示例: class Node { public List Children { get; set; } public int SompeProperty { get; set; } public String SomeOtherProperty { get; set; } } 我遍历尝试的方式如下: static void TraverseTree(Node ParentNode) { if (ParentNode.Children == null) return; foreach (var child in ParentNode.Children) { TraverseTree(child); } } ParentNode.Children方法大约需要1毫秒,因为Node表示文件或目录。 我只是用这个节点的例子来说明我的观点。 所以如果你考虑一下,如果第一个节点有4个子节点,并且每个子节点都有10000000个后代,那么如果我们在一个separeate线程中利用并行编程来遍历这4个子节点中的每一个,我们就可以提高这种遍历的速度。 如果那就是情景那么我会采取这种方法。 但如果我事先不知道树的结构我怎么能这样做呢? 我一直在考虑: 1)开始遍历树,将具有子节点的前10个节点放在堆栈上,然后在单独的线程上开始遍历每个节点。 2)做类似的事情: […]

我可以安全地绑定到multithreading应用程序上的数据吗?

我正在尝试解决一个经典问题 – 我有一个multithreading应用程序,它运行一些处理器密集型计算,带有GUI界面。 每当其中一个线程完成一项任务时,我就想更新一个表上的状态 taskID | 状态 我以下列方式使用DataGridView和BindingList: BindingList tasks; dataGridView.DataSource = tasks public class Task : INotifyPropertyChanged { ID{get;} Status{get;set;} } 后台线程可以安全地更新任务的状态吗? GUI中会以正确的顺序看到更改吗? 第二个问题:我什么时候需要致电PropertyChanged? 我试着在有和没有通话的情况下跑步,似乎没有打扰.. 第三个问题:我在MSDN上看到dataGridView使用BindingSource作为DataGridView.DataSource和BindingList之间的中介这真的有必要吗?