Tag: multithreading

我该如何处理“CrossThreadMessagingException”?

我有一个简单的代码,通过标签组件在我的GUI中显示时间顺序。 此代码位于计时器的tick事件中。 有时,我得到“Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException”,我不知道为什么? 我怎么能抓住这个例外? 如何更改我的代码以避免出现此exception? //Calculate and show elapsed time TimeSpan ElapsedTime = DateTime.Now – this.StartTime; this.LabelElapsedTime.Text = String.Format(“{0:00}:{1:00}:{2:00}”, ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds);

C#:如何通过以某种方式从另一个线程发出信号来强制从主线程“调用”一个方法

对不起长标题,我甚至不知道如何表达问题的方式 我正在使用一个库,它从主线程(是一个C库)的不同上下文运行回调,我在C#中创建了回调,当我被调用时,我想提出一个事件。 但是因为我不知道事件内部会是什么,我想找到一种方法来调用方法而不会出现锁等问题(否则第三方用户将不得不在事件中处理这个问题,非常难看) 有没有办法做到这一点? 我可以完全错误的方式,但我正在考虑winforms方式来处理不同的线程(.Invoke的事情) 否则我可以发送消息到窗口的消息循环,但我不知道很多关于消息传递,如果我可以发送像这样的“自定义”消息 例: private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext) { OnConfigure(EventArgs.Empty); return 0U; } 这个回调是从另一个我无法控制的程序调用的,我想在主线程中运行OnConfigure方法(处理我的winform的那个),怎么做呢? 换句话说,我想运行OnConfigure而不需要考虑锁 编辑1: 我有这个例外的问题: CallbackOnCollectedDelegate reived消息:在GarbageCollector中收集的委托’G19dotNet!G19dotNet.LgLcd + lgLcdOnSoftButtonsCB :: Invoke’上运行回调。 在非托管代码期间,应确保代理永远不会被删除,直到您确定它们永远不会被调用 编辑2: 问题由我自己解决,感谢Stackoverflow总是帮助我! 供将来参考: 将委托定义为函数指针

为什么Thread.Sleep()以这种方式运行?

这是我编写的一个简单代码: private void button1_Click(object sender, EventArgs e) { label1.Text = “first”; Thread.Sleep(1000); label1.Text = “second”; } 但标签从不显示“第一”。 我使用断点检查并且语句label1.text =“first”被执行但是在标签中没有显示“first”,只显示“second”。 为什么会这样?

C#后台线程如何告诉UI线程它已完成某些操作?

脚本 假设你有一个C#WinForms应用程序进行一些数据处理。 您有一个方法可以从UI线程调用的数据库中检索数据。 然后运行后台线程来执行此任务。 您希望UI继续执行其操作而不会被锁定和无响应。 题 如何让后台线程运行并进行处理,然后在返回结果时自动提醒UI线程?

了解AttachThreadInput – 分离失去焦点

我有一个完全理解AttachThreadInput的问题。 我知道它是“连接”2个线程的消息队列,这(我想做的)允许我例如强制我的窗口(winforms)在前台。 我可以用这种方法做什么: private void SetForegroundWindowEx(IntPtr hWnd) { uint SW_SHOW = 5; uint appThread = GetCurrentThreadId(); uint foregroundThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); if (foregroundThread != appThread) { AttachThreadInput(foregroundThread, appThread, true); BringWindowToTop(hWnd); ShowWindow(hWnd, SW_SHOW); AttachThreadInput(foregroundThread, appThread, false); } else { BringWindowToTop(hWnd); ShowWindow(hWnd, SW_SHOW); } } 然而,一旦线程分离,两个窗口都会失去焦点。 如果我等待消息队列清空(Application.DoEvents())并激活我的窗口(现在处于前台但没有聚焦),它将重新获得焦点并保留它。 如果我在消息队列为空之前执行此操作,它将再次失去焦点。 所以我猜想分离的东西会从我的窗户中获得焦点,但我不知道那是什么或如何防止它。 这是我不太了解的第一件事。 我没有得到的第二件事是,如果我没有将窗口设置为前景: AttachThreadInput(foregroundThread, appThread, true); AttachThreadInput(foregroundThread, appThread, false); […]

使用参数创建新线程时索引超出范围?

我正在研究关于烘焙算法的项目,但我没有在C#中使用该算法的任何演示。 由于这种情况,我已经转换了一些我在维基百科上找到的java代码。 但无论如何,它似乎不起作用! 更新 :这是我的全部工作代码(旧代码包含在“//”注释中) namespace BakeryAlgorithm { class Program { static int threads = 10; static string x = “”; static int count = 0; static int[] ticket = new int[threads]; static bool[] entering = new bool[threads]; public static void doLock(int pid) { entering[pid] = true; int max = 0; for (int i = […]

C#中的线程和异步操作

我是一只试图学习新技巧的老狗。 我非常熟悉一种名为PowerBuilder的语言,用这种语言,当你想异步做事时,你会在一个新线程中产生一个对象。 我将重申: 整个对象在一个单独的线程中实例化,并具有不同的执行上下文 。 该对象上的任何和所有方法都在该单独线程的上下文中执行。 那么现在,我正在尝试使用C#实现一些异步执行,而.NET中的线程模型对我来说感觉完全不同。 看起来我在一个线程中实例化对象,但我可以指定(在逐个调用的基础上)某些方法在不同的线程中执行。 差异似乎很微妙,但令我感到沮丧。 我老派的想法说:“我有一个名叫鲍勃的助手。鲍勃下台做事。” 如果我理解的话,新学校的思维是“我是鲍勃。如果我需要的话,我有时可以揉肚子,同时拍拍头脑。” 我的实际编码问题:我正在编写一个接口引擎,它通过TCP接受消息,将它们解析为可用数据,然后将这些数据放入数据库。 “解析”消息大约需要一秒钟。 根据解析的数据,数据库操作可能需要不到一秒钟,或者可能需要十秒钟。 (所有时间都是为了澄清问题。) 我的老派思维告诉我,我的数据库类应该存在于一个单独的线程中,并且有类似ConcurrentQueue东西。 它只会在该队列上旋转,处理可能存在的任何内容。 另一方面,解析器需要将消息推送到该队列中。 这些消息将是(委托?)诸如“基于this object的数据创建订单”或“基于this object的数据更新订单”之类的内容。 值得注意的是,我实际上想要以严格的单线程FIFO顺序处理“队列”中的“消息”。 基本上,我的数据库连接无法始终跟上我的解析器。 我需要一种方法来确保我的解析器在我的数据库进程试图赶上时不会减慢速度。 建议吗? – 编辑:带代码! 每个人都在告诉我使用BlockingCollection 。 所以这里是最终目标和代码的简要说明: 这将是一项Windows服务。 启动时,它将产生多个“环境”,每个“环境”包含一个“dbworker”和一个“接口”。 “接口”将具有一个“解析器”和一个“监听器”。 class cEnvironment { private cDBWorker MyDatabase; private cInterface MyInterface; public void OnStart () { MyDatabase = new cDBWorker (); MyInterface = new […]

Parallel.ForEach没有启动新线程

Parallel.ForEach没有旋转新线程 大家好,我们有一个非常密集的IO操作,我们使用Microsoft的.NET Framework并行扩展中的Parallel.ForEach编写。 我们需要删除大量文件,并且我们将要删除的文件表示为列表列表。 每个嵌套列表中都有1000条消息,我们有50条这样的列表。 这里的问题是,当我查看后面的日志时,我只看到在Parallel.ForEach块内执行一个线程。 这是代码的样子: List<List> expiredMessagesLists = GetNestedListOfMessages(); foreach (List subList in expiredMessagesLists) { Parallel.ForEach(subList, msg => { try { Logger.LogEvent(TraceEventType.Information, “Purging Message {0} on Thread {1}”, msg.MessageID, msg.ExtensionID, Thread.CurrentThread.Name); DeleteMessageFiles(msg); } catch (Exception ex) { Logger.LogException(TraceEventType.Error, ex); } }); } 我用一个更简单的数据结构编写了一些示例代码,没有IO逻辑,我可以在Parallel.ForEach块中看到几个不同的线程。 我们在上面的代码中使用Parallel.ForEach做错了吗? 它可能是绊倒它的列表列表,还是IO操作存在某种线程限制?

在一次设置最大运行任务时等待多个异步任务

所以我刚开始尝试理解异步,任务,lambda等等,我无法让它像我想的那样工作。 使用下面的代码我希望它能锁定btnDoWebRequest,将一个未知数量的WebRequests作为任务执行,并且一旦所有任务完成,就解锁btnDoWebRequest。 但是我只希望最多3个或者我一次运行的任务数量,这部分来自于我有一组任务,一次只运行X. 但是在以多种方式尝试和修改我的代码之后,它将始终立即跳回并重新启用btnDoWebRequest。 当然VS警告我需要等待,目前在“.ContinueWith((任务)”和“await Task.WhenAll(requestInfoList .Select(async i =>”)中的异步,但似乎无法工作在哪里或如何投入所需的等待。当然,因为我仍然在学习,所以我很有可能在这一切都错了,整个事情需要重新修改。所以任何帮助都将非常感激。 谢谢 private SemaphoreSlim maxThread = new SemaphoreSlim(3); private void btnDoWebRequest_Click(object sender, EventArgs e) { btnDoWebRequest.Enabled = false; Task.Factory.StartNew(async () => await DoWebRequest()).Wait(); btnDoWebRequest.Enabled = true; } private async Task DoWebRequest() { List requestInfoList = new List(); for (int i = 0; dataRequestInfo.RowCount – 1 > i; […]

使用Thread.Abort杀死HttpWebRequest对象

所有,我试图使用类似于下面的代码的方法取消两个并发的HttpWebRequests(以伪ish C#显示)。 Main方法创建两个创建HttpWebRequests的线程。 如果用户希望,他们可以通过单击按钮然后调用Abort方法来中止请求。 private Thread first; private Thread second; private string uri = “http://somewhere”; public void Main() { first = new Thread(GetFirst); first.Start(); second = new Thread(GetSecond); second.Start(); // Some block on threads… like the Countdown class countdown.Wait(); } public void Abort() { try { first.Abort(); } catch { // do nothing } try […]