Tag: multithreading

C#Windows窗体应用程序 – 从另一个线程AND类更新GUI?

我搜索了很多,但我似乎无法找到与我的具体问题有关的任何内容。 我希望能够从另一个类(SocketListener)更新我的MainUI表单,并且我有一个处理网络的线程(clientThread)。 现在我可以从网络线程运行简单的输出,例如写入调试器输出和创建MessageBox。 但我真正想做的是能够调用clientThread中的代码,该代码将在我的MainUI实例上执行操作。 我怎样才能做到这一点? 此外,如果有人想要代码的特定部分,那么我可以发布它,以帮助您更好地理解我的要求。 最好的祝福!

杀死.NET线程

我创建了一个运行某种方法的线程。 但有时我想杀死线程,即使它仍在工作。 我怎样才能做到这一点? 我尝试了Thread.Abort(),但它显示了一个消息框,说“线程已中止”。 我该怎么办?

在WPF应用程序中执行后台任务

例 private void Start(object sender, RoutedEventArgs e) { int progress = 0; for (;;) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } } 如果我想要Start(),推荐的方法是什么(TAP或TPL或BackgroundWorker或Dispatcher或其他) 不要阻止ui线程 可以提供进度报告 可以取消 支持multithreading和多核

.NET 4.0和可怕的OnUserPreferenceChanged Hang

我一直受到可怕的OnUserPreferenceChanged Hang的困扰,Ivan Krivyakov在这里很好地提到了这里: http://ikriv.com/en/prog/info/dotnet/MysteriousHang.html#BeginInvokeDance 我刚回来时发布了一个问题,当时我最初遇到问题: 又一个C#死锁调试问题 我以为我已经通过移除一个由UI线程构建的Control来解决它,但过了一会儿它再次出现(可能永远不会离开……)。 我们一直在使用.NET 3.5,据我所知使用的是CLR 2.0。 最近,applciation已升级为使用.NET 4.0 Client Profile / CLR 4.0。 此外,我们已从Infragistics WinForms 10.1升级到10.3。 唯一的另一个区别是以前的版本是混淆的……有没有人遇到过混淆和挂起的问题? 我已经再次尝试摆脱任何应用程序挂起一次又一次,但不同寻常的是,我无法在最新版本中重现挂起(使用.NET 4.0)。 使用Ivan Krivyakov的方便的Freezer应用程序(请参阅他的文章),可以根据请求触发WM_SETTINGCHANGE消息,以便在以前的版本(使用.NET 3.5)中重现。 可能是我有点希望问题已经从它自己的消失中消失了,但是有人知道CLR从2.0到4.0是否有任何变化会导致这种情况发生? ————————————————– – -解 – – – – – – – – – – – – – – – – – – – – – – – —- 因此,在测试应用程序的变体后,例如CLR […]

如何从另一个线程更新GUI上的文本框

我是C#的新手,我正在尝试创建一个简单的客户端服务器聊天应用程序。 我在我的客户端窗体上有RichTextBox,我正在尝试从另一个类的服务器更新该控件。 当我尝试这样做时,我得到错误: “跨线程操作无效:控制textBox1从其创建的线程以外的线程访问”。 这是我的Windows窗体的代码: private Topic topic; public RichTextBox textbox1; bool check = topic.addUser(textBoxNickname.Text, ref textbox1, ref listitems); 主题类: public class Topic : MarshalByRefObject { //Some code public bool addUser(string user, ref RichTextBox textBox1, ref List listBox1) { //here i am trying to update that control and where i get that exception textBox1.Text += […]

Thread.Sleep小于1毫秒

我想用小于1毫秒的时间调用线程hibernate。 我读到没有thread.Sleep也没有Windows-OS支持。 那是什么解决方案? 对于所有想知道我为什么需要这个的人:我正在进行压力测试,并想知道我的模块每秒可以处理多少消息。 所以我的代码是: // Set the relative part of Second hat will be allocated for each message //For example: 5 messages – every message will get 200 miliseconds var quantum = 1000 / numOfMessages; for (var i = 0; i < numOfMessages; i++) { _bus.Publish(new MyMessage()); if (rate != 0) Thread.Sleep(quantum); } 我很高兴得到你的意见。

超时模式 – Thread.Abort真的有多糟糕?

我在各种网站上看到Thread.Abort不是很好用。 在这种情况下,如何实现超时模式? 例如,我已经读过MS在整个框架中使用下面的模式(我已经用扩展方法包装)。 就个人而言,我认为这是一个非常酷的扩展,但我担心Thread.Abort。 有没有人有更好的方法? public static bool CallandWait(this Action action, int timeout) { Thread subThread = null; Action wrappedAction = () => { subThread = Thread.CurrentThread; action(); }; IAsyncResult result = wrappedAction.BeginInvoke(null, null); if (((timeout != -1) && !result.IsCompleted) && (!result.AsyncWaitHandle.WaitOne(timeout, false) || !result.IsCompleted)) { if (subThread != null) { subThread.Abort(); } return false; […]

await Task 和Task .Result有什么区别?

public async Task GetName(int id) { Task nameTask = Task.Factory.StartNew(() => { return string.Format(“Name matching id {0} = Developer”, id); }); return nameTask.Result; } 在上面的方法return语句我使用Task.Result属性。 public async Task GetName(int id) { Task nameTask = Task.Factory.StartNew(() => { return string.Format(“Name matching id {0} = Developer”, id); }); return await nameTask; } 我在这里使用等待任务。 如果我认为await将释放调用线程但是Task.Result将阻止它,我会不会错,它会是正确的吗?

跨线程操作无效

可能重复: 跨线程操作无效:从创建它的线程以外的线程访问控制 好的,我知道为什么这会给我这个错误: 跨线程操作无效:控制从其创建的线程以外的线程访问的“Form1”。 但是……我怎样才能使这个可行? System.Threading.Thread t = new System.Threading.Thread(()=> { // do really hard work and then… listView1.Items.Add(lots of items); lots more UI work }); t.Start(); 我不关心Thread何时或如何完成,所以我并不关心任何花哨或过于复杂的atm,除非它在使用新线程中的UI时会更容易。