Tag: multithreading

监控C#线程 – 哪个/什么时候做什么

作为每个人,我习惯于在逐步模式下调试VS中的代码。 好吧,既然我到处都有许多背景工作者的申请,我不再在堪萨斯州。 调试线程应用程序的最有效方法是什么,并能够监视每个线程以跟踪代码中发生的事情? 截至目前,我坚持使用每个线程的单独记录器实例进行良好的调试,但这正在慢慢变成一场噩梦,我很快就会淹没在我自己的日志中。

如何杀死C#线程?

我有一个线程,在我们的(旧)SQL服务器上查找数据。 随着数据的进入,我将信息发布到modal dialog – 在进行所有这些处理时,用户不能也不应该做任何其他事情。 modal dialog只是让他们看到我正在做某事并阻止他们同时运行另一个查询。 有时(很少)当代码调用SQL服务器时,服务器没有响应(IT将其关闭以进行维护,LAN线被切断,或者PC不在网络上)或执行查询的人没时间了。 因此,modal dialog确实有一个取消按钮。 Thread对象(System.Threading.Thread)具有IsBackground=true 。 当有人点击取消时,我会调用我的KillThread方法。 注意:我不能在此类中使用BackgroundWorker组件,因为它与某些Windows Mobile 5代码共享,而WM5没有BackgroundWorker。 void KillThread(Thread th) { if (th != null) { ManualResetEvent mre = new ManualResetEvent(false); Thread thread1 = new Thread( () => { try { if (th.IsAlive) { //th.Stop(); // ‘System.Threading.Thread’ does not contain a definition for ‘Stop’ // and […]

在同步中花费的线程时间是否过高?

今天,我使用Visual Studio 2010性能分析器分析了我的一个C#应用程序。 具体来说,我正在对“ 并发 ”进行概要分析,因为看起来我的应用程序应该具有更多的容量然后才能进行演示。 分析报告显示,线程在同步状态下花费了大约70-80%的时间。 说实话,我不确定这意味着什么。 这是否意味着应用程序遭受了锁定状态? 对于上下文…有大约30个长时间运行的线程绑定到单个AppDomain( 如果这很重要 )并且一些线程非常繁忙(例如while(true) { _waitEvent.WaitOne(0); //do stuff } )。 我意识到这是一个相当模糊的问题……我想我正在寻找一些关于线程同步状态含义的阐释。 多少钱,为什么? ~75%真的很糟糕吗? 我有太multithreading吗? 或者我应该开始寻找其他领域?

我可以在多个查询中拆分查询或创建并行性来加速查询吗?

我有一个表avl_pool ,我有一个函数可以在地图上找到最接近该(x, y)位置的链接。 该选择的性能非常线性,该function需要~8 ms才能执行。 因此,计算此行选择1000行需要8秒。 或者,正如我在此示例中所示,20.000行需要162秒。 SELECT avl_id, x, y, azimuth, map.get_near_link(X, Y, AZIMUTH) FROM avl_db.avl_pool WHERE avl_id between 1 AND 20000 “Index Scan using avl_pool_pkey on avl_pool (cost=0.43..11524.76 rows=19143 width=28) (actual time=8.793..162805.384 rows=20000 loops=1)” ” Index Cond: ((avl_id >= 1) AND (avl_id <= 20000))" " Buffers: shared hit=19879838" "Planning time: 0.328 ms" "Execution […]

C#:String作为事件的参数?

我有一个用于表单的GUI线程和另一个计算事物的线程。 表单有一个richtTextBox。 我希望worker-thread将字符串传递给表单,以便每个字符串都显示在文本框中。 每次在工作线程中生成一个新字符串时,我都会调用一个事件,现在应该显示该字符串。 但我不知道如何传递字符串! 这是我到目前为止所尝试的: ///// Form1 private void btn_myClass_Click(object sender, EventArgs e) { myClass myObj = new myClass(); myObj.NewListEntry += myObj_NewListEntry; Thread thrmyClass = new Thread(new ThreadStart(myObj.ThreadMethod)); thrmyClass.Start(); } private void myObj_NewListEntry(Object objSender, EventArgs e) { this.BeginInvoke((MethodInvoker)delegate { // Here I want to add my string from the worker-thread to the textbox! richTextBox1.Text […]

Threadsafe FIFO队列/缓冲区

我需要实现一种任务缓冲区。 基本要求是: 在单个后台线程中处理任务 从多个线程接收任务 处理所有收到的任务,即确保在收到停止信号后缓冲区的缓冲任务耗尽 必须保持每个线程接收的任务顺序 我正在考虑使用如下的队列来实现它。 希望得到有关实施的反馈。 还有其他更明智的想法来实现这样的事情吗? public class TestBuffer { private readonly object queueLock = new object(); private Queue queue = new Queue(); private bool running = false; public TestBuffer() { } public void start() { Thread t = new Thread(new ThreadStart(run)); t.Start(); } private void run() { running = true; bool […]

从.NET Windows服务调用Shell32.dll

我有一个.NET 4.0库,它使用Shell32和Folder.GetDetailsOf()从WTV文件中获取元数据。 我已成功使用它与控制台和Windows窗体应用程序没有问题。 但由于某种原因,从.NET 4.0 Windows服务调用组件时,启动Shell类的调用会导致COM错误。 库中失败的代码: Shell32.Shell shell = new Shell(); 错误: 无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“Shell32.Shell”。 此操作失败,因为IID为“{286E6F1B-7113-4355-9562-96B7E9D64C54}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULTexception:0x80004002(E_NOINTERFACE)) 。 我阅读了我的公寓线程,COM Interops,动态,PIA等等,但是我找到的解决方案没有解决问题。 它必须是来自另一个无法看到Interop的线程的调用。 请帮忙 :)

从定时器线程调用GUI线程上的方法

在我的应用程序中,我使用计时器来检查RSS提要中的更新,如果找到新项目,我会弹出一个自定义对话框来通知用户。 当我手动运行检查时,一切都很好,但是当自动检查在计时器Elapsed事件中运行时,不会显示自定义对话框。 首先是这是一个线程问题? (我假设这是因为手动和自动检查都使用相同的代码)。 当我运行自动检查时,是否必须从Timers Elapsed事件处理程序调用运行检查的方法? 我的自定义对话框类中是否需要执行某些操作? 编辑:这是一个winforms应用程序。 以下是代码的示例。 (请不要在此代码示例中指出语法错误,这只是一个简单的示例,而不是真正的代码)。 public class MainForm : System.Windows.Forms.Form { //This is the object that does most of the work. ObjectThatDoesWork MyObjectThatDoesWork = new ObjectThatDoesWork(); MyObjectThatDoesWork.NewItemsFound += new NewItemsFoundEventHandler(Found_New_Items); private void Found_New_Items(object sender, System.EventArgs e) { //Display custom dialog to alert user. } //Method that doesn’t really exist in […]

在退出程序之前等待System.Threading.Timer回调完成

我有一个List 。 每个Timer以可配置的间隔(默认为10分钟)触发。 全部调用相同的回调方法(使用不同的参数)。 回调方法可能需要几秒钟才能完成它的工作。 当程序终止时,看起来回调方法的执行会立即停止(我是否正确看到了?)。 在退出程序之前,如何优雅地等待任何当前正在执行的回调方法?

c#中的线程超时

我是C#线程的新手。 有没有为线程设置超时而不阻塞调用线程(在C#3.5中)? 如果没有,使用线程执行函数是否合乎逻辑,并且在该函数内创建一个线程并加入它来克服这个主线程阻塞问题? 为了显示: 代替: Public void main() { … Thread thrd1 = new Thread(new ThreadStart(targetObj.targetFunc)); thrd1.Start(); thrd1.Join(); … } 使用类似的东西: Public void main() { … Thread thrd1 = new Thread(new ThreadStart(middleObj.waiter)); thrd1.Start(); … } //And in the middleObj.waiter(): Public void waiter() { Thread thrd2 = new Thread(new ThreadStart(targetObj.targetFunc)); thrd2.Start(); thrd2.Join(); }