Tag: multithreading

事件处理程序不是线程安全吗?

所以我已经阅读过,而不是直接调用事件 if (SomeEvent != null) SomeEvent(this, null); 我应该这样做 SomeEventHandler temp = SomeEvent; if (temp != null) temp(this, null); 为什么会这样? 第二个版本如何变得线程安全? 什么是最佳做法?

你可以从另一个线程访问UI元素吗? (没有设定)

我在google / here上看到很multithreading在UPDATING来自另一个线程的UI元素。 如果我想获得复选框的值,该怎么办? 我能不做任何特别的事情吗?

为什么我会收到此错误:“跨线程操作无效:控制从其创建的线程以外的线程访问的lbFolders。”?

这令我感到困惑,也许有人可以用我的无知来照亮教育之光。 这是在C#windows应用程序中。 我从一个线程访问列表框的内容。 当我尝试像这样访问它时 prgAll.Maximum = lbFolders.SelectedItems.Count; 我收到了错误。 但是,这是我没有得到的部分。 如果我注释掉那一行,那就是下一行 foreach (string dir in lbFolders.SelectedItems) 执行得很好。 编辑:像往常一样,我缺乏沟通技巧。 让我澄清一下。 我知道从除了创建它们之外的线程访问GUI项会导致问题。 我知道访问它们的正确方法是通过委托。 我的问题主要在于:为什么我可以正常访问和迭代SelectedItems对象,但是当我尝试获取(未设置)它的Count属性时,它会爆炸。

在C#中做一些工作时显示进度条?

我想在做一些工作时显示进度条,但这会挂起UI并且进度条不会更新。 我有一个带有ProgressBar的WinForm ProgressForm,它将以一种大型方式无限期地继续。 using(ProgressForm p = new ProgressForm(this)) { //Do Some Work } 现在有很多方法可以解决这个问题,比如使用BeginInvoke ,等待任务完成并调用EndInvoke 。 或者使用BackgroundWorker或Threads 。 我在使用EndInvoke时遇到了一些问题,尽管这不是问题。 问题是你用来处理这种情况的最好和最简单的方法,你必须向用户显示程序正在运行而不是没有响应,以及如何使用最简单的代码来处理这个问题,这是有效的并且赢得了’ t泄漏,并可以更新GUI。 像BackgroundWorker需要有多个函数,声明成员变量等。然后你需要保持对ProgressBar表单的引用并处理它。 编辑 : BackgroundWorker不是答案,因为它可能是我没有获得进度通知,这意味着不会调用ProgressChanged因为DoWork是对外部函数的单个调用,但我需要继续调用Application.DoEvents(); 进度条保持旋转。 赏金是针对此问题的最佳代码解决方案。 我只需要调用Application.DoEvents()以便Marque进度条可以工作,而worker函数在Main线程中工作,并且它不会返回任何进度通知。 我从不需要.NET魔术代码来自动报告进度,我只需要一个比以下更好的解决方案: Action exec = DoSomethingLongAndNotReturnAnyNotification; IAsyncResult result = exec.BeginInvoke(path, parameters, null, null); while (!result.IsCompleted) { Application.DoEvents(); } exec.EndInvoke(result); 保持进度条活着(意味着不冻结但刷新品牌)

多进程读写一个文件

我有一个txt文件ABC.txt,它将由多个进程读取和写入。 因此,当一个进程正在读取或写入文件ABC.txt时,必须锁定文件ABC.txt,以便任何其他进程无法读取或写入它。 我知道枚举System.IO.FileShare可能是处理这个问题的正确方法。 但我用另一种方式,我不确定它是否正确。 以下是我的解决方案。 我在文件夹中添加了另一个文件Lock.txt。 在我可以读取或写入文件ABC.txt之前,我必须能够从文件Lock.txt中读取。 在我读取或写入文件ABC.txt后,我必须释放该function。 以下是代码。 #region Enter the lock FileStream lockFileStream = null; bool lockEntered = false; while (lockEntered == false) { try { lockFileStream = File.Open(“Lock.txt”, FileMode.Open, FileAccess.Read, FileShare.None); lockEntered = true; } catch (Exception) { Thread.Sleep(500); } } #endregion #region Do the work // Read from or write to […]

如何在C#中使用AOP在不同线程之间共享数据?

如何在不同线程之间共享数据在C#中不使用静态变量? 我们可以使用属性创建这样的机制吗? 在这种情况下,面向方面的编程是否有帮 要实现这一点,所有不同的线程应该在单个对象上工作?

跨线程Winforms控件编辑

如果编辑文本的代码“属于”包含Windows窗体的单独线程,如何编辑Windows窗体元素中的文本? 我得到了例外: 跨线程操作无效:控制’textBox1’从其创建的线程以外的线程访问。 谢谢。

我可以使用Json.net在一次操作中将嵌套属性序列化到我的类中吗?

让我们说我的模型如下: public class MyModel { public string Name { get; set; } public string[] Size { get; set; } public string Weight { get; set; } } 和Json这样: { “name” : “widget”, “details” : { “size” : [ “XL”,”M”,”S”, ] “weight” : “heavy” } } 我一直试图找到一种方法来序列化我的对象,而不是为“名称”创建一个模型,而为“详细信息”创建一个模型,因为这不能很好地映射到我的数据库,所以需要一点点玩杂耍来填充类。 我可以在JsonConvert.PopulateObject()上进行多次传递,如: var mod = new MyModel(); JsonConvert.PopulateObject(json.ToString(), mod); JsonConvert.PopulateObject(json[“details”].ToString(), […]

Console.ReadKey()与multithreading的奇怪行为

在multithreading程序中使用Console.ReadKey()时,我遇到了一个奇怪的问题。 我的问题是:为什么会这样? 这是一个错误,还是因为我滥用Console ? (请注意, 根据文档 ,控制台应该是线程安全的 。) 用代码解释这个是最容易的: using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication2 { internal class Program { private static void Main(string[] args) { Console.WriteLine(“X”); // Also try with this line commented out. Task.Factory.StartNew(test); Console.ReadKey(); } private static void test() { Console.WriteLine(“Entering the test() function.”); Thread.Sleep(1000); Console.WriteLine(“Exiting the test() function.”); } […]

Interlocked.CompareExchange是否使用内存屏障?

我正在阅读Joe Duffy关于Volatile读取和写入以及及时性的post,我正在尝试理解post中最后一个代码示例: while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ; m_state = 0; while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ; m_state = 0; … 执行第二次CMPXCHG操作时,它是否使用内存屏障来确保m_state的值确实是写入它的最新值? 或者它只是使用已存储在处理器缓存中的某些值? (假设m_state未声明为volatile)。 如果我理解正确,如果CMPXCHG不会使用内存屏障,那么整个锁获取过程将不公平,因为第一个获取锁的线程很可能是将获得所有锁的线程。 以下锁 。 我理解正确,还是我错过了什么? 编辑 :主要问题实际上,在尝试读取m_state的值之前,调用CompareExchange是否会导致内存障碍。 因此,当尝试再次调用CompareExchange时,是否所有线程都可以看到赋值0。