Tag: multithreading

Thread.Join()导致死锁

我总共有三个主题。 第一个是主UI线程,它启动System.Threading.Thread ( ExperimentThread ),然后启动BackgroundWorker ( WorkerThread )。 MainThread和WorkerThread都访问共享资源。 我使用以下对象同步对此资源的访问: private static readonly Object LockObject = new Object(); 我在每个线程的主循环中使用如下: lock (LockObject) { // Do something with shared resource here. } ExperimentThread的简化版本如下: public void RunExperiment { while (!bStopThread) { lock (LockObject) { // Do something with shared resource here. } if (bStopThread) { break; } else […]

如何在multithreading应用程序中安全地使用SmtpClient.SendAsync

在我的应用程序中,我使用Dataflow库中的ActionBlock ,使用SmtpClient.SendAsync()方法发送电子邮件警报,该方法不阻止调用线程。( ActionBlock从BufferBlock获取数据,并使用bufferBlock.LinkTo(actionBlock)绑定块bufferBlock.LinkTo(actionBlock) )。 但是,如果.SendAsync()另一个.SendAsync()调用,则此方法将抛出InvalidOperationException 。 根据MSDN 文档 ,发送操作完成时会引发public event SendCompletedEventHandler SendCompleted 。 我如何确保ActionBlock生成的线程(或Tasks )之间的竞争不会导致抛出InvalidOperationException ? 到目前为止,有一个想法是将我的类(发送电子邮件)添加到SendAsync()调用和将被分配给SendCompleted事件的私有函数的私有锁。 当线程到达SendAsync()它获得锁定,并且当引发事件时,私有函数解锁锁定,允许其他线程获得锁定和进度。

我怎样才能将WaitHandle子类化?

是否有可能(以有意义的方式)? 例如,假设我想实现一个可等待的队列,如下所示: public class WaitableQueue : WaitHandle { public WaitableQueue() { q = new Queue(); } public void Enqueue(Object Arg) { lock(this) { q.Enqueue(Arg); // set the waithandle here (how?) } } public Type Dequeue() { lock(this) { if(q.Count == 1) // reset the waithandle here (how?) return q.Dequeue(); } } Queue q; }

C#中的进度条和后台工作者

目前我正在开发一个需要从Web服务中消耗大量数据的项目。有服务类向服务器发送输入日期并返回结果,由于耗时的过程,需要用户组合进度条和后台工作者向用户显示进程百分比。 我已经浏览了很多关于这个主题的示例代码,但仍然无法找到最佳方法。 你能帮忙吗,我的代码是关注的, private MyCollection[] callWebService(string[] Inputs, string method) { List results = new List(); string fiel dNames = “”; // todo – fix this if nothing left in loop int sizeOfArray = 500; for (int i = 0; i < Inputs.Length; i = i + sizeOfArray) { string[] outputRecords; int errorCode; string errorString; string[] […]

BackgroundWorker.RunWorkerCompleted和threading

AFAIK,承诺在创建者线程( BackgroundWorker RunWorkerCompleted Event )中调用此事件; 在大多数情况下,它按照承诺行事。 但是,有时RunWorkerCompleted 不会在创建BackgroundWorker对象的线程中调用。 更新:代码是这样的: Trace.WriteLine(Thread.CurrentThread.ManagedThreadId); var worker = new BackgroundWorker(); worker.DoWork += (s, args) => Trace.WriteLine(Thread.CurrentThread.ManagedThreadId); worker.RunWorkerCompleted += (s, args) => Trace.WriteLine(Thread.CurrentThread.ManagedThreadId); worker.RunWorkerAsync(); 输出为1 7 7(正确输出必须为1 7 1) 有任何想法吗?

如何在后台线程中预加载图像?

在我的WPF应用程序中,我需要加载一些图像。 我只需要一次显示一个图像。 如果我在需要时加载图像,则会稍有延迟。 所以我心想:“嘿,为什么不在后台线程中做一些预加载?不能那么难。” 我对线程有一些经验,但还不足以知道这个想法是错误的。 我开始编程并遇到一些问题。 我解决了一些问题,我可能也解决了其他问题,但这会产生意大利面条代码。 所以,我认为从头开始将是最好的。 需要什么初始规划来构建一个漂亮的小预加载线程? 是否有某种模式或类似的东西? 这是我目前的设置: LinkedList用于存储图片的pathes并导航到下一张图片 Dictionary用于存储预加载的图像

C#互锁function作为锁机制?

当我读到有关ReaderWriterLockSlim锁定机制时, 有人提出Interlock Functions可用于更精细的锁定 另外,我在这里找到了 Marc的另一个答案: …写入对克隆副本进行更改,然后使用Interlocked.CompareExchange交换引用(如果另一个线程在临时中突变了引用,则重新应用它们的更改)。 好吧,目前我所知道的Interlocked对象,就是它(在multithreading环境中)用来做primefacesadditions , compare , compare , compareExchange操作。 (我知道如何使用它) 但是( 这是我的问题 ) – 题 我如何将其用作锁 ? (示例代码将非常感谢) 编辑 为简单起见,我粘贴了这段代码( 这不是线程安全的 – 如果同时由两个线程调用Go ,则可能会得到一个被零除错误 ): class ThreadUnsafe { static int _val1 = 1, _val2 = 1; static void Go() { if (_val2 != 0) Console.WriteLine (_val1 / _val2); _val2 = 0; […]

将程序作为线程执行而不是作为进程执行

有没有办法执行另一个程序,如记事本,作为一个线程,所以它与我的程序共享相同的内存空间? 所以,如果我的程序结束,记事本也会这样,记事本不会出现在任务管理器中,只是我的程序?

在按钮单击事件中中止长时间运行的线程

在我的WPF应用程序中,我有一个长时间运行的过程,使用BlueBeam Q Server将文件转换为PDF。 当进程发生时,它不应该冻结,因此下面的代码已经编写以处理: private void btn_convert_Click(object sender, RoutedEventArgs e) { thread = new Thread(new ThreadStart(WorkerMethod)); thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Name = “PDF”; thread.Start(); } WorkerMethod() { //code to connect to Q server and conversion goes here } 现在,当流程开始时,用户可以看到取消按钮。 当用户按下取消时,我想中止启动的线程。 我写了如下代码: private void btn_cancel_Click(object sender, RoutedEventArgs e) { if (thread.Name == “PDF”) thread.Abort(); } 但该线程不会中止并继续该过程。 […]

又一个C#死锁调试问题

我使用VS2010 Professional在C#中构建了一个multithreading应用程序。 这是一个相当大的应用程序,我们之前已经经历过分类GUI交叉线程和死锁问题,但在过去的一个月里,我们注意到当它闲置大约20-30分钟时似乎锁定了。 该应用程序是无响应的,虽然当其他窗口被拖到应用程序前面并在其上面时它会重新绘制,但GUI似乎仍然被锁定… …(如果GUI线程被使用了相当长的时间) )关闭,最大化和最小化按钮也是无响应的,当点击时,应用程序的标题中不显示小(无响应…)文本,即Windows仍然认为它运行正常。 如果我使用调试器中断/暂停应用程序,并查看正在运行的线程。 我们的托管代码有3个线程正在运行,还有一些其他工作线程无法显示源代码。 运行的3个线程是: 主/ GUI线程 一个无限循环的线程 一个无限循环的线程 如果我进入线程2和3,它们似乎正在循环。 它们不共享锁(即使使用主GUI线程),它们根本不使用GUI线程。 然而,当进入主/ GUI线程时,它在Application.Run上被破坏了…… 这个问题让我感到僵局,但我不明白的是,如果它是死锁,为什么我看不到主/ GUI线程挂起的代码行? 任何帮助将不胜感激! 如果您需要更多信息,请与我们联系… 干杯, 袋鼠 ————————————————– – -解 – – – – – – – – – – – – – – – – – – – – – – – —- 好的,所以问题现在解决了。 感谢大家的建议! 非常感激! 我已经标记了解决我最初确定应用程序挂起的主/ UI线程的问题的答案(我没有关闭“启用我的代码”选项)。 […]