Tag: multithreading

如何在提供WPF Dispatcher事件时等待WaitHandle?

有人给我发了电子邮件,询问我是否有WaitOneAndPump于WPF的WaitOneAndPump版本。 目标是在同一堆栈帧上等待句柄(类似于WaitHandle.WaitOne )并在等待时泵送WPF Dispatcher事件。 我真的不认为这样的API应该在任何生产代码中使用,无论是对于WinForms还是WPF (可能除了UI自动化之外)。 WPF没有公开WinForms的DoEvents的显式版本,这是一个非常好的设计决策,考虑到DoEvents API一直滥用的公平份额 。 然而,这个问题本身很有意思,所以我将把它作为一个练习,并发布任何我想出的答案。 如果有兴趣,请随意发布您自己的版本。

设置线程标识

在C#中,如何设置线程的标识? 例如,如果我已经启动了Thread MyThread,我可以更改MyThread的身份吗? 或者这不可能吗?

进度条不适用于zipfile? 当程序似乎挂起时如何提供反馈

我对C#和编码很新,所以其中一些可能是错误的方式。 我编写的程序按预期工作并压缩文件,但如果源代码很大,程序会出现(对Windows)挂起。 我觉得我应该使用Thread但我不确定这会有所帮助。 我会使用进度条但来自System.IO.Compression Ionic.Zip.ZipFile的’new’(。net 4.5)库取代了Ionic.Zip.ZipFile没有报告进度的方法? 有没有解决的办法? 我应该使用Thread吗? 还是DoWork ? 麻烦的是用户和系统没有得到关于程序正在做什么的反馈。 我不确定我是以正确的方式提出这个问题。 下面是正在运行的代码,但同样会出现挂起系统的问题。 private void beginBackup_Click(object sender, EventArgs e) { try { long timeTicks = DateTime.Now.Ticks; string zipName = “bak” + timeTicks + “.zip”; MessageBox.Show(“This Will take a bit, there is no status bar :(“); ZipFile.CreateFromDirectory(Properties.Settings.Default.source, Properties.Settings.Default.destination + “\\” + zipName); MessageBox.Show(“Done!”); this.Close(); } catch […]

如何在长时间运行* UI *操作期间刷新UI

在你将我的问题标记为重复之前,请听我说。 大多数人都在进行长时间运行的非UI操作,并且需要取消阻止UI线程。 我有一个长期运行的UI操作, 必须在UI线程上运行,这阻止了我的应用程序的其余部分。 基本上,我是在运行时动态构造DependencyObject并将它们添加到我的WPF应用程序上的UI组件。 需要创建的DependencyObject的数量取决于用户输入,其中没有限制。 我有一个测试输入有大约6000个DependencyObject需要创建并加载它们需要几分钟。 在这种情况下使用后台工作程序的常用解决方案不起作用,因为一旦DependencyObject由后台工作程序创建,它们就不能再添加到UI组件,因为它们是在后台线程上创建的。 我目前尝试解决方案是在后台线程中运行循环,为每个工作单元分配到UI线程,然后调用Thread.Yield()以给UI线程提供更新的机会。 这几乎可以工作 – UI线程确实有机会在操作期间多次更新自己,但应用程序仍然基本上被阻止。 在长时间运行的操作过程中,如何让我的应用程序继续更新UI并在其他表单上处理事件? 编辑:根据要求,我当前的“解决方案”的一个例子: private void InitializeForm(List myCollection) { Action doWork = (nonDepObj) => { var dependencyObject = CreateDependencyObject(nonDepObj); UiComponent.Add(dependencyObject); // Set up some binding on each dependencyObject and update progress bar … }; Action background = () => { foreach (var nonDependencyObject in myCollection) […]

从单独的线程访问表单的控件

我正在练习线程并遇到了这个问题。 情况是这样的: 我在一个表单上有4个进度条,一个用于下载文件,一个用于显示页面加载状态等… 我必须从一个单独的线程控制每个ProgressBar的进度。 问题是我收到了一个InvalidOperationException 跨线程操作无效:控制’progressBar1’从其创建的线程以外的线程访问。 我错了这种方法还是有人能告诉我如何实现这个?

当winform应用程序关闭时,如何停止线程

我有一个单例,它有一个运行线程,用于从服务器获取记录。 但是,当我停止我的winform应用程序时,线程继续运行。 我试图在我的单例中创建一个析构函数,以便在线程运行时中止该线程,但它对线程没有任何影响 – 我知道析构函数是被引发的。 我正在寻找关于如何在我的应用程序关闭时关闭线程的建议。 谢谢 C#,。net2

什么是停止正在运行的线程的安全方法?

我有一个包含执行IronPython脚本的线程。 出于某种原因,我可能需要随时停止此线程,包括脚本执行。 怎么做到这一点? 第一个想法是Thread.Abort() ,但它已知是邪恶的……

线程安全类应该在其构造函数的末尾有一个内存屏障吗?

在实现一个用于线程安全的类时,我是否应该在其构造函数的末尾包含一个内存屏障,以确保在访问它们之前已完成任何内部结构的初始化? 或者消费者有责任在将实例提供给其他线程之前插入内存屏障吗? 简化问题 : 由于初始化和线程安全类的访问之间缺乏内存屏障,下面的代码中是否存在种族风险可能会导致错误行为? 或者线程安全类本身是否应该防止这种情况? ConcurrentQueue queue = null; Parallel.Invoke( () => queue = new ConcurrentQueue(), () => queue?.Enqueue(5)); 请注意,程序可以接受任何内容,如果第二个委托在第一个委托之前执行,则会发生这种情况。 (null条件运算符?.在这里防止NullReferenceException 。)但是,程序抛出IndexOutOfRangeException , NullReferenceException ,多次排队5 ,陷入无限循环或执行任何其他操作都不应该是可接受的。由内部结构的种族危害引起的怪异事物。 详细问题 : 具体来说,假设我正在为队列实现一个简单的线程安全包装器。 (我知道.NET已经提供了ConcurrentQueue ;这只是一个例子。)我可以写: public class ThreadSafeQueue { private readonly Queue _queue; public ThreadSafeQueue() { _queue = new Queue(); // Thread.MemoryBarrier(); // Is this line required? } […]

Parallel.For(Foreach)将创建多少个线程? 默认MaxDegreeOfParallelism?

我想知道,当我运行Parallel.For / ForEach循环时将使用多少个线程。 我发现,它可以通过MaxDegreeOfParallelism选项进行更改。 MSDN上的MaxDegreeOfParallelism帮助说( 链接 ): 默认情况下,For和ForEach将使用底层调度程序提供的许multithreading,因此从默认值更改MaxDegreeOfParallelism仅限制将使用多少并发任务。 但我不知道调度程序提供了多少线程。 我该怎么知道呢? 我可以用9999999运行的循环测试它,但是这个测试会显示我的数字,但不会显示确定该数字的规则。 稍后编辑/添加: 我搜索了“sheduler max concurrency”,我发现(在MSDN – 链接 ), TashSheduler类具有MaximumConcurrencyLevel属性,并且: 返回表示最大并发级别的整数。 默认调度程序返回Int32.MaxValue。 TaskSheduler类是否用作这些并行循环的“底层调度程序”?

从另一个线程_and_类更新WinForm控件

我正在制作一个WinForms程序,它需要单独的线程为了可读性和可维护性,我将所有非GUI代码分离到不同的类中。 这个类还“生成”另一个类,它进行一些处理。 但是,我现在遇到的问题是我需要从一个在另一个类中启动的线程更改WinForms控件(将字符串附加到文本框) 我已经四处搜索,并找到了不同线程的解决方案,并且在不同的类中,但不是两者,并且所提供的解决方案似乎不兼容(对我而言) 这可能是最大的“领先”: 如何从另一个类中运行的另一个线程更新UI 类层次结构示例: class WinForm : Form { … Server serv = new Server(); } // Server is in a different thread to winform class Server { … ClientConnection = new ClientConnection(); } // Another new thread is created to run this class class ClientConnection { //Want to modify winform from […]