Tag: multithreading

当在多个线程内使用时,HttpWebResponse会混淆

在我的应用程序中,我有一些线程将从Web服务获取数据。 基本上我只是打开一个URL并获得XML输出。 我有几个线程持续执行此操作,但具有不同的URL。 有时结果会混淆不清。 XML输出不属于线程的URL,而属于另一个线程的URL。 在每个线程中,我创建了类GetWebPage的实例,并从此实例调用方法Get。 该方法非常简单,主要基于MSDN文档中的代码。 (见下文。我在这里删除了我的error handling!) public string Get(string userAgent, string url, string user, string pass, int timeout, int readwriteTimeout, WebHeaderCollection whc) { string buffer = string.Empty; HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url); if (!string.IsNullOrEmpty(userAgent)) myWebRequest.UserAgent = userAgent; myWebRequest.Timeout = timeout; myWebRequest.ReadWriteTimeout = readwriteTimeout; myWebRequest.Credentials = new NetworkCredential(user, pass); string[] headers = whc.AllKeys; foreach […]

使用TPL的生产者消费者模型,.net 4.0中的任务

我有一个相当大的XML文件(大约1-2GB)。 要求是将xml数据持久保存到数据库中。 目前,这是通过3个步骤实现的。 尽可能多地读取内存占用较少的大文件 从xml-data创建实体 使用SqlBulkCopy将创建的实体中的数据存储到数据库中。 为了获得更好的性能,我想创建一个Producer-consumer模型,其中生产者创建一组实体,例如批量为10K并将其添加到Queue中。 并且消费者应该从队列中获取批量实体并使用sqlbulkcopy持久化到数据库。 谢谢,Gokul void Main() { int iCount = 0; string fileName = @”C:\Data\CatalogIndex.xml”; DateTime startTime = DateTime.Now; Console.WriteLine(“Start Time: {0}”, startTime); FileInfo fi = new FileInfo(fileName); Console.WriteLine(“File Size:{0} MB”, fi.Length / 1048576.0); /* I want to change this loop to create a producer consumer pattern here to process […]

如何正确取消在后台STA线程上运行的打印任务?

[请注意:这个问题在我的另一个问题中得到了有效解决: 如何使用canceltokensource取消后台打印 ] 我一直在使用以下方法(从SO)运行我的打印机并在后台线程上打印预览: public static Task StartSTATask(Action func) { var tcs = new TaskCompletionSource(); var thread = new Thread(() => { try { func(); tcs.SetResult(null); } catch (Exception e) { tcs.SetException(e); } }); thread.SetApartmentState(ApartmentState.STA); thread.Priority = ThreadPriority.AboveNormal; thread.Start(); return tcs.Task; } 它运行完美,没有错误。 我不知道如何适当地取消这个任务。 我应该完全中止线程还是传入CancellationTokenSource令牌? 如何更改上述代码以允许取消(或中止)? 我很迷茫。 感谢您对此的任何帮助。 (经过大量的谷歌搜索,这里的解决方案根本不像我希望的那样微不足道!) 经过深思熟虑后,我倾向于将CancellationToken传递给正在执行的func(),并强制终止该函数。 在这种情况下,这意味着要关闭PrintDialogue()。 还有另一种方式吗? 我使用上面的代码: public override […]

从BackgroundWorker线程更新Image UI属性

在我写的WPF应用程序中,我有一个TransformedBitmap属性,它绑定到UI上的Image对象。 每当我更改此属性时,图像都会更新(因此更新显示在屏幕上的图像)。 为了防止UI在我检索下一个图像时冻结或无响应,我正在尝试使用BackgroundWorker进行快照检索,如下所示: private void bw_DoWork(object sender, DoWorkEventArgs e) { e.Result = this.snapshotHelper.GetSnapshot(ImageFormat.Bmp); } 然后,在我的RunWorkerCompleted方法中,我有以下内容: private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.CurrentImage = (TransformedBitmap)e.Result; …. } 这似乎工作正常,直到我更新CurrentImage属性时用于告诉Image对象更新的NotifyPropertyChanged方法; 我得到一个跨线程错误。 public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { //The following causes a “the calling thread cannot access this object because […]

在处置后监控多个Threading.Timers

我有一个进程,它创建一个动态的定时器列表(System.Threading.Timer)并继续运行,直到收到一个信号终止。 一旦收到信号终止,我希望任何现有的定时器回调完成(见下文): private IList _timers = new List(); … … private void WaitOnExecutingThreads() { var waiters = new List(_timers.Count); foreach (var timer in _timers) { var onWait = new ManualResetEvent(false); waiters.Add(onWait); timer.Dispose(onWait); } WaitHandle.WaitAll(waiters.ToArray()); waiters.ForEach(x=> x.Dispose()); } 此代码现在可以正常工作,但是我希望在处理定时器后监视正在进行的线程回调。 我的意图是以给定间隔写入日志“定时器A仍在运行”。 我开始玩: ThreadPool.RegisterWaitForSingleObject(….) add添加了以下内容:(注意:我创建了一个包含计时器和关联数据的ThreadContext类) private void WaitOnExecutingThreads() { var waiters = new List(); WaitOrTimerCallback IsRunning = (x, […]

是否存在由子Thread对象自动inheritance的可编程数据?

我有一个想法,解决在.Net中枚举托管线程和跟踪线程祖先的问题(哪个线程创建了哪个其他线程)。 如果可以使用程序员创建的对象标记Thread对象,并在创建它们时自动将其复制到子线程,则可以使用该标记来跟踪何时创建新线程,创建它们的人等等。灵感来自unix,其中,当一个进程被分叉时,它inheritance了打开的文件句柄等。如果有一些数据是1)线程本地或绑定到Thread对象而2)被自动复制到new线程和3)是可修改的,这将是一个良好的开端。 我猜我们将不得不使用reflection来访问一些启动链的Thread对象的成员,因为我在线程中看到的大多数可能有用的东西都被锁定了,但它是一个开始。 我不确定这种方法有多么明智。 编辑:我想我会更好地解释我的用例,因为我认为没有人理解。 我知道明确地跟踪线程,我已经在之前拥有的代码中做了很多。 那不是问题。 基本上,我正在尝试实现’线程组上下文’,就像.Net具有appdomain-context,远程上下文[1]和汇编线程组合 – 本地上下文[2]一样 。 对于从公共线程生成的给定线程组,我想将信息与该分组相关联。 虽然我明白.Net没有这个概念(否则我没有问题!),它并没有改变.Net中的每个托管线程都由一个且只有一个其他托管线程创建的事实,因此,可以用树形结构绘制。 我试图解决的问题是:我有一个API,它有一个上下文对象。 这个API调用一个大型的外部代码库来完成实际的工作,并从它的创建线程开始。 该外部没有显式获取API上下文对象的副本,但是它需要一个才能在API上进行调用。 由于它没有对API上下文对象的引用,因此无法进行这些调用。 就目前而言,外部库确实需要进行调用,并且这样做会在单个静态字段中查找当前上下文对象,这意味着每个AppDomain只能有一个API实例。 我希望解决这个问题。 这个外部库部分不受我的控制,我的API和外部库之间的接口没有显式传递上下文对象。 到目前为止,当外部库需要调用API时,它会查看我的API中的静态字段以获取对上下文对象的引用。 问题是,最终的可执行文件每个AppDomain只能有一个我的API会话实例,因为我们使用静态字段将上下文对象传递给外部库(主力)代码。 一种选择是在我的API中创建一个GetContextObject()方法。 当API生成线程以运行外部库代码时,它会记住共享静态字典中的该线程。 当外部库代码调用GetContextObject()时,它将查找正在运行的线程并返回该线程的正确上下文对象。 如果外部库代码从未创建自己的线程,那么我没有问题,我总是有一个100%正确的线程到上下文的映射。 但是,外部库确实创建了自己的线程,并且没有我的API知道。 当API接收到来自这些线程的调用时,它将不知道要放弃哪个上下文对象,并且必须猜测 – 如果只注册了一个上下文对象,它会使用它,否则,它会抛出一个exception,说它不能告诉你。 如果我可以将数据标记为由该父线程创建的线程inheritance的线程对象,那么我可以实现此跟踪系统。 此外,外部库不使用线程池。 基本上,我的选择是这样的: 1)重新设计我的API和外部库之间的接口以传入上下文对象,并重新设计外部库以正确传递此上下文对象。 涉及约100万LOC的涉及。 1a)禁止外部库直接使用Thread对象,而是要求他们使用我自己的MyApiThread对象,该对象在创建时会将自己添加到我的自定义跟踪机制中。 与选项#1相比,需要在外部库中更改更少的代码,但仍需要进行大量返工。 2)强制我的API的使用者在新的AppDomain中启动每个API会话,以便我可以将我的上下文对象存储在静态字段中(这是今天的’解决方案’)。 AppDomains涉及很多开销,我不想强​​迫我的用户。 3)找到一种跟踪线程祖先的方法,以便能够根据调用线程将正确的上下文对象返回到从外部库调用的代码。 这是这篇文章的主题。 对于那些说Windows没有子父线程概念的人来说,你是偏离基础的 – 这是无关紧要的。 DotNet不是一个仅限Windows的系统,它的设计是将它与运行的机器和操作系统隔离开来,这就是.Net以Mono的forms存在于Linux,Solaris,FreeBSD的原因。 此外,Java确实具有我需要的线程祖先的概念,而Java是在Windows上实现的,因此这是一个非常可能和合理的概念。 虽然我意识到.Net api有一个特定于微软的特定弯曲,但我们意识到,在很大程度上,.Net和Windows是独立的。

Async Callbacks在哪个线程上运行?

我正在进行几个HttpWebRequest.BeginGetResponse调用,并且在BeginGetResponse的回调方法中,我正在调用一个EventHandler。 在EventHandler中,有一些逻辑可以测试下载是否成功。 如果没有,它会尝试重新下载Html。 我注意到有很multithreading被生成,尤其是在出现错误时。 那么,Async Callbacks在哪个线程上运行? 无论如何我可以在原始线程上调用EventHandler吗? 如果那不可行,我可以在UI线程上调用它吗? 谢谢!

我们可以使用multithreading将Microsoft Word文档转换为C#中的HTML吗?

我有一个Windows服务,它会轮询数据库中任何类型为doc,docx,pdf和rtf的上传文档,并将它们转换为HTML并将它们保存到本地文件系统中。 文档从数据库中提取并在内存中排队,然后由多个线程拾取以从共享队列进行处理。 我面临的问题是,处理在一段时间内会变慢。 转换在最初几天发生得更快,对于大小为50 KB的文档说2秒,对于同一文档几天时间说20秒后更慢。 随着时间的推移,我所能看到的是处理时间的下降趋势。 我无法确定导致这种下降趋势的原因。 即使重新启动Windows服务也无济于事。 Microsoft Office安装在Windows Server上以进行文档转换。 每天有近2000个文档正在转换为HTML。 所以我的问题是我们可以使用multithreading将Microsoft Word文档处理为HTML吗?

如何在保存后立即检索objectId

我正在使用Unity和Parse.com进行游戏开发。 我试图弄清楚我在保存后立即检索objectId。 我试过这个: ParseObject myGame = new ParseObject(“Games”); myGame[“score”] = 223; myGame[“playerName”] = “Michael”; Task saveTask = myGame.SaveAsync().ContinueWith(t => { ParseObject theObject = t.Result; string newObjectId = theObject.objectId; }); 我对t.Result说错了: Type `System.Threading.Tasks.Task’ does not contain a definition for `Result’ and no extension method `Result’ of type `System.Threading.Tasks.Task’ could be found (are you missing a using […]

潜在的并发问题?

我一直在构建ASP.NET MVC应用程序,当我启动它时,我担心潜在的multithreading问题。 一个特别关注的是以下代码: private static IDictionary _settingsDictionary = new Dictionary(); public T Settings() where T : ISettings, new() { var key = typeof(T).FullName; if (!_settingsDictionary.ContainsKey(key)) _settingsDictionary[key] = _settingsService.GetSettings(); return (T)_settingsDictionary[key]; } 请注意,字典定义为静态。 这允许我缓存字典,以便它为应用程序长度的每个请求返回相同的实例。 这在本地测试时工作正常,但我担心它可能会被数百名用户使用。 这使我开始研究ConcurrencyDictionary。 请问你能告诉我是否需要使用它以及如果是这样我会怎么做。 谢谢