Tag: multithreading

如何更正“从其创建的线程以外的线程访问”的错误?

以下代码给出了以下错误。 我想我需要“InvokeRequired”。 但我不明白我该怎么用? 跨线程操作无效:控制’listBox1’从其创建的线程以外的线程访问。 代码: using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } protected static DataSet dataset = null; private void Form1_Load(object sender, EventArgs e) { } private void timer1_Tick(object sender, EventArgs e) { […]

异步/等待代码中的竞争条件

我只是想知道下面的代码中是否出现竞争条件: int readingFiles; async Task ReadFile (string file) { ++readingFiles; var text = await Stream.ReadFileAsync(file); –readingFiles; return text; } 如果线程池线程执行ReadFile方法,则readFiles将由两个不同的线程访问,而readingFiles变量不受任何同步惯用法的保护。 这意味着对于执行“–readingFiles”的其他线程,readFiles的第一次更新不应该是可见的。 但是,我从未在“–readingFiles”之后看到readingFiles等于-1。 我检查同一个线程是否使用Thread.CurrentThread执行++和 – 操作。 在大多数情况下,它不是同一个线程,我仍然没有看到readingFiles为-1。 即使存在竞争条件且readingFiles不易变,为什么我不能看到这种竞争条件的影响?

当我的计时器滴答… .NET内存泄漏

我有一个.NET System.Threading.Timer计时器,每隔60秒滴答一次,并在每个tick上引入内存泄漏。 在计时器的每个刻度上,代码分配一个IDisposable对象(称为SocketsMessageConnector)……但我确实正确处理它。 我运行了.NET Memory Profiler,每60秒我看到一个新的SocketsMessageConnector类实例在内存中停留(所以在15分钟后,我有15个实例)。 内存分析器validation实例是否已被释放,但它显示了一个以TimerCallback为根的实例,该实例以_TimerCallback为根,该查询以GCHandle为根… 什么在这里? 为什么TimerCallback保持在每个计时器滴答上创建的新实例? PS。 在拍摄快照之前,探查器强制2个GC,所以我知道它实际上是泄漏而不仅仅是GC的优化。

C#代表,参考解析时间

我有一个关于.net委托的简单问题。 说我有这样的事情: public void Invoke(Action action) { Invoke(() => action(this.Value)); } public void Invoke(Action action) { m_TaskQueue.Enqueue(action); } 第一个函数包含对this.Value的引用。 在运行时,当第一个带有generics参数的方法被调用时,它会以某种方式提供this.Value到第二个,但是如何? 我想到了这些: 按值调用(struct) – 传递this.Value的当前值,因此如果m_TaskQueue在5分钟后执行它,则该值将不会处于其最近状态,它将是第一次引用时的值。 通过引用调用(引用类型) – 然后在执行操作期间引用最近的Value状态,但如果我在执行操作之前将this.Value更改为另一个引用,它仍将指向旧引用 按名称调用(两者) – 在this.Value将评估this.Value 。 我相信实际的实现将持有this的引用,然后在实际执行委托期间评估该Value ,因为没有按名称调用。 我认为这将是名称样式的调用,但无法找到任何文档,所以想知道它是否是一个明确定义的行为。 这个类类似于Scala或Erlang中的Actor,所以我需要它是线程安全的。 我不希望Invoke函数立即取消引用Value ,这将通过m_TaskQueue在this对象的安全线程中m_TaskQueue 。

在C#应用程序中的线程之间共享数据库连接?

我发现关于这个主题的信息很少,希望有人可以指导我一些信息和可能的示例代码。

在写任何锁之前,我应该对multithreading问题进行unit testing吗?

我正在编写一个我知道需要锁的类,因为该类必须是线程安全的。 但是,因为我是测试驱动 – 开发我知道在为它创建测试之前我不能编写一行代码。 而且我发现很难做到,因为测试最终会变得非常复杂。 在这些情况下你通常做什么? 有什么工具可以帮助吗? 这个问题是.NET特定的 有人要求代码: public class StackQueue { private Stack stack = new Stack(); private Queue queue = new Queue(); public int Count { get { return this.queue.Count + this.stack.Count; } } public void Enqueue(WebRequestInfo requestInfo) { this.queue.Enqueue(requestInfo); } public void Push(WebRequestInfo requestInfo) { this.stack.Push(requestInfo); } private WebRequestInfo Next() { […]

Visual Studio 2010的“线程”窗口中的和详细信息

我一直在尝试使用一个应用程序调试与线程相关的一些问题。 当我附加到应用程序时,我看到一个像这样的窗口: 这个名为“[Thread Destroyed]”的post是什么? 应用程序代码肯定不会写这个名字。 什么意味着Thread的调用堆栈不可用。 “Acquisition Engine”线程在应用程序内部创建,并在循环内运行直到停止。 如果线程被停止,它将退出循环并终止它的生命,因此它应该在线程列表中。 如果它存在,因为它还没有退出循环,那么,又是什么意味着callstack不可用? 在此先感谢您的帮助,这个似乎并不容易。

C#+ =线程安全吗?

刚刚遇到一个程序,其中+ =用于线程之间的共享变量,所以+ =线程安全,即primefaces地执行添加和赋值?

.NET ConcurrentDictionary.ToArray()ArgumentException

当我调用ConcurrentDictionary.ToArray时,有时会收到以下错误。 错误如下: System.ArgumentException:索引等于或大于数组的长度,或者字典中的元素数大于从索引到目标数组末尾的可用空间。 在System.Collections.Concurrent.ConcurrentDictionary 2.System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair>.CopyTo(KeyValuePair在System.Linq.Buffer 1..ctor(IEnumerable 2.System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair>.CopyTo(KeyValuePair 2 []数组,Int32索引) System.Linq.Enumerable.ToArray [TSource](IEnumerable 1 source) at …Cache.SlidingCache (IEnumerable 1 source) at …Cache.SlidingCache (Object state)in … \ SlidingCache.cs:line 141 at在System.Threading.QuereadingUserWorkItemCallback.System上的System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,Object状态,Boolean preserveSyncCtx)中的System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)。 System.Threading.ThreadPoolWorkQueue.Dispatch()中的Threading.IThreadPoolWorkItem.ExecuteWorkItem() 我注意到在multithreading场景中,有时在对ConcurrentDictionary进行排序时会出现exception。 请参阅堆栈溢出问题。 所以我在排序之前开始使用ConcurrentDictionary.ToArray。 在创建arrays时似乎仍然存在问题。 并发字典用于缓存,当达到缓存的设置的最大元素数时,该缓存维护对象并刷新最后访问的对象。 多个线程访问缓存,并且在尝试删除旧元素时会发生上述错误,因此可以将新元素添加到arrays中。 请参阅下面的一些代码段: public class SlidingCache : IDictionary { public int MinCount { get; private set; } […]

C#/ VB.Net任务vs线程与BackgroundWorker

我有“谷歌搜索”但仍然与任务,线程和后台工作者混淆….. “任务是在当前线程上运行的高级API”是否正确? 如果1是正确的,为什么我需要使用invoke来更改同一线程中任务内的UI? Backgroundworker在应用程序中只有最低优先级? 那么backgroundworker的性能低于任务和线程? 对 ? 最后,在我的应用程序中,我需要使用“HttpWebRequest”从服务器获取一个字符串,之后解析字符串并更新UI。 如果我使用“HttpWebRequest.BeginGetResponse”等待异步结果并触发完整事件来更新UI,我需要使用invoke方法来调用UI线程控件,但是我可以使用后台工作器而不是吗? 我可以简单地在“RunWorkerCompleted”事件中更改UI,有什么不利之处吗? 对不起我的游泳池英语并感谢您的帮助……!