Tag: multithreading

检测不可变量的高效方法?

我有一个实用程序,旨在传递我们系统周围的对象。 由于它是一个multithreading环境,因此该实用程序会对其传递的每个对象进行深层复制,以防止出现任何线程安全问题。 我正在努力转换我们的系统以使用不可变对象来消除对此副本的需要。 我想知道检测对象是不可变的最好(最快)方法是什么? 我的第一个想法就是了解我们放在所有不可变对象(MessageAttribute)上的属性。 正如您从下面的性能配置文件中看到的那样,它会受到很大影响(大约是所有其他检查执行时间的10倍)。 我怎么能检测到我的不可变通过? 我可以做一个typeof()比较,看起来效果更好,但这看起来相当笨拙,而且随着我们一直添加更多不可变的东西,它将是难以维护的。 编辑:我忘了提到布尔值被重构为变量以用于分析,实际上,结果存储在isDefined的表达式实际上是在else if语句中,因此将被击中大约10倍。这个配置文件(我更关心平均执行时间而不是绝对执行时间)。

哪个C#程序集包含Invoke?

替代问题:为什么VS10如此热衷于抱怨Invoke? 在我不断追求让我的应用程序成为世界上最好的C#程序员的过程中,我认为线程是一件好事。 MSDN有一篇关于对控件进行线程安全调用的有用文章,但它(以及看似关于该主题的所有其他文章)倾斜地引用了一个名为Invoke的方法。 有时甚至是BeginInvoke, 我读过的也是首选 。 如果我能让visual studio识别Invoke,那么这一切都会很棒。 MSDN说它包含在System.Windows.Forms程序集中 ,但我已经’使用’了。 可以肯定的是,我也尝试过使用System.Threading,但无济于事。 我需要通过哪些环节才能调用工作?

停止multithreadingWindows服务

我在.Net 3.5中有一个multithreading的Windows服务,当创建多个线程时,我有一些麻烦来正确停止服务。 这项服务用于创建一个线程来完成所有工作,我只是将其更改为multithreading。 它工作正常,但是当服务停止时,如果正在执行多个线程,它将挂起服务直到所有线程都完成。 当服务启动时,我创建一个后台线程来处理主进程: protected override void OnStart(string[] args) { try { //Global variable that is checked by threads to learn if service was stopped DeliveryConstant.StopService = false; bool SetMaxThreadsResult = ThreadPool.SetMaxThreads(10, 10); ThreadStart st = new ThreadStart(StartThreadPool); workerThread = new Thread(st); workerThread.IsBackground = true; serviceStarted = true; workerThread.Start(); } catch (Exception ex) { […]

C#:如何测试基本的线程工作者类

我正在考虑如何测试multithreading的东西,但不太确定如何开始。 我相信如果我能把事情搞定,我会更容易找到更多的东西,所以我想知道是否有人可以帮助我为这个简单的类编写一个NUnit测试用例: class Worker { public event EventHandler Done = (s, e) => { }; public void StartWork() { var thread = new Thread(Work) { Name = “Worker Thread” }; thread.Start(); } private void Work() { // Do some heavy lifting Thread.Sleep(500); Done(this, EventArgs.Empty); } } 我想测试的是: Done事件在Done时是否会被提升。 如果它是同步的话我会没有问题,但是当它不是时,我也不确定从哪里开始。 一个简单的测试,如果它不是multithreading的(并且Work方法不是私有的)可能是: [TestFixture] class WorkerTests { [Test] […]

catchedexception如何为null(不是NullReferenceException)?

我遇到了一个相当奇怪的小问题。 在下面的代码中,我无法理解e如何为null ; try { //Some Code here } catch (Exception e) { //Here e is null } 据我所知, throw null将被转换为throw new NullReferenceException() 。 问题似乎与multithreading有关,因为删除另一个线程似乎也解决了它。 或者至少我只在上面的代码在新线程中运行时才看到这个。 整个程序使用很multithreading,有点复杂。 无论如何我的问题是,如何才能为空? – 希望答案可以帮助找到这个问题的根源。 编辑我发现它,因为它在catch语句中导致了NullReferenceException,并且使用调试器我看到同样的事情。 编辑2第二天打开VisualStudio再次尝试,没有代码更改,现在相同的口号被“调用”,但这次e不为空。 看起来这是一个VS故障。

Gui在使用线程时冻结

我被困住了,希望有人可以帮助我。 我已经制作了一个类/ gui,其加载条设置为选取框,这样当执行任务时我可以将其显示给用户。 在我的一个gui类中,在第一行的构造函数中,我正在创建此类的新实例然后执行 LoadingBar bar = new LoadingBar(); Thread thread = new Thread(bar.Show); thread.Start(); 然而,即使主程序线程正在做一些更密集的东西,这个gui似乎仍然冻结,即使我使用backround worker。 我提到的方法有什么问题,如果有的话,我需要改变什么? 谢谢

锁定在代码执行期间可能更改的对象

假设我有一个锁定对象引用的线程 线程#1 lock(myObj) { … } 稍后在代码中我有myObj = new XYZObj(); 然后线程#2锁定它 lock(myObj) { … } 如果对象引用已更改,此代码是否是线程安全的? 当对象引用更改时,第一个锁仍然有效?

C#在单独的线程中连接到数据库

我有一个位于任务栏中的应用程序,并定期检查数据库(通过SQLConnection)。 如果数据库无法访问,它只会在通知图标上显示红色状态,而不显示任何其他内容。 这是因为用户将使用在设施之间旅行的笔记本电脑,并且数据库只能在内部网络上或通过VPN连接时访问。 我遇到的问题是,当数据库无法访问时,我仍然希望通知图标上下文菜单能够响应。 目前,如果用户在数据库尝试连接时尝试与菜单进行交互,则线程会被连接尝试锁定。 我想要的是数据库连接发生在一个单独的线程中,但我知道在线程之间共享连接对象是一件坏事。 数据库连接后,我需要从原始线程查询它。 有没有好办法呢? 我知道我可以在新线程中使用rus函数并简单地检查连接是否失败,然后如果返回成功,原始线程可以继续并连接它自己的数据库对象。 但这种方法似乎是一个糟糕的解决方法。 想法? 谢谢! 感谢您的建议 – 我从他们那里学到了很多东西。 最后,我做了我应该从一开始就做的事情。 每当需要定期更新数据库时,主(UI)线程就会启动一个新线程(包括数据库对象创建和连接)。 因此,就像HenkHolterman在对我的原始消息的评论中所建议的那样,我真的不需要创建数据库并在单独的线程中使用它运行操作。 一旦我升级到VS2010,我一定会对使用SqlConnection.OpenAsync感兴趣。 再次感谢。

即使调用Close(),为什么在ManualResetEvent上等待的线程会继续等待?

今天我们惊讶地发现等待一个ManualResetEvent线程继续等待事件,即使它已经关闭。 我们原本期望调用Close()会隐式发出等待线程的信号。 我们追踪这一点是因为我们的一些Windows服务没有像我们想的那样快速关闭。 我们正在更改所有关闭ManualResetEvent引用的Dispose实现,先调用Set 。 任何人都可以解释为什么Close不会隐式调用Set ? 你什么时候想要一个等待的线程继续等待? 这是我们的测试代码,用于演示我们的发现: private static readonly Stopwatch _timer = Stopwatch.StartNew(); public static void Test() { var sync = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(state => { Log(“ThreadPool enter, waiting 250ms…”); sync.WaitOne(250); Log(“ThreadPool exit”); }); Log(“Main sleeping 100”); Thread.Sleep(100); Log(“Main about to close”); // sync.Set(); // Is Set called implicitly? No… sync.Close(); Log(“Main […]

在实现时间受限的方法时,我应该中止工作线程还是让它运行?

我目前正在为现有应用程序编写基于Web服务的前端。 为此,我使用WCF LOB适配器SDK ,它允许创建自定义WCF绑定,将外部数据和操作公开为Web服务。 SDK提供了一些实现的接口,并且它们的一些方法是时间约束的:实现期望在指定的时间跨度内完成其工作或抛出TimeoutException 。 调查让我想到了“ 实现C#通用超时 ”的问题,明智地建议使用工作线程。 有了这些知识,我可以写: public MetadataRetrievalNode[] Browse(string nodeId, int childStartIndex, int maxChildNodes, TimeSpan timeout) { Func work = () => { // Return computed metadata… }; IAsyncResult result = work.BeginInvoke(null, null); if (result.AsyncWaitHandle.WaitOne(timeout)) { return work.EndInvoke(result); } else { throw new TimeoutException(); } } 但是,如果工作线程超时,则不清楚如何处理工作线程。 人们可以忘记它,就像上面的代码那样,或者可以中止它: public MetadataRetrievalNode[] Browse(string […]