Tag: multithreading

在System.Collections.Concurrent.ConcurrentDictionary中防御竞争条件

.NET ConcurrentDictionary容易受到可能导致意外数据的竞争条件的影响,如本MSDN文章底部所述。 我假设有几个因素需要考虑。 问:我应该如何编写不易受可能导致数据丢失的竞争条件的代码? 在我的场景中,我有一个输入流,它具有一个不断增加的索引(n ++)。 我的想法是,如果竞争条件发生,我可以检测到丢失的数据并重新发送。 另一方面,可能有更好的方法来做到这一点,我不知道。

如何处理这个C​​#hang invloving SystemEvents.OnUserPreferenceChanged

我的WinForm应用程序有挂起问题。 发生的事情是,客户端有时会让应用程序在一夜之间运行,并且当它们在早上应用程序中恢复时,通常处于挂起状态。 这是我在主线程上的转储文件中看到的。 我不明白的是什么可以调用SystemEvents.OnUserPreferenceChanged事件,虽然我不认为我正在做任何调用此事件的事情。 0024e480 770496f4 System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean) 0024e52c 702c68af System.Threading.WaitHandle.WaitOne(Int64, Boolean) 0024e548 702c6865 System.Threading.WaitHandle.WaitOne(Int32, Boolean) 0024e55c 6e891a6f System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle) 0024e570 6ebcd6eb System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean) 0024e610 6e8933cc System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[]) 0024e644 6eac0c83 System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback, System.Object) 0024e65c 6fe1eed2 Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(Boolean, System.Object[]) 0024e690 6fe1d07f Microsoft.Win32.SystemEvents.RaiseEvent(Boolean, System.Object, System.Object[]) 0024e6dc 6fe1e38f Microsoft.Win32.SystemEvents.OnUserPreferenceChanged(Int32, IntPtr, IntPtr) 0024e6fc 6fa64c29 Microsoft.Win32.SystemEvents.WindowProc(IntPtr, Int32, IntPtr, IntPtr) […]

C#阻塞等待响应

我多次偶然发现这个问题,主要用黑客来解决它,但是希望看到一个“推荐者”的方式去做。 我正在编写一个通信协议,与我的端点询问“查询”的方式非常相似,他们收到“回复”。 现在……我想实现一个名为SendCommand的函数,该函数将发出一个查询,并等待对该问题的回复,并将其返回。 所以我可以做点什么 int outside_temp = SendCommand(What is the temperature outside).ToInt(); 这样做的问题是消息是异步发送和接收的,并且事件通知我新消息已经到达,以及它是什么。 我需要阻止该线程,直到对所提到的查询的回复到达,提取其数据内容,并将其返回给调用者。 我的问题是阻止线程。 阻止线程不是问题,我们正在谈论一个multithreading应用程序,因此UI不会冻结等等,但问题是实现这一目的的正确方法是什么? 我正在考虑在SendCommand函数中初始化信号量,等待它,并在消息接收事件处理程序中释放信号量(在检查它是正确的消息后)? 此致,axos88

当两个线程都不是WinForm时,在两个线程之间引发事件

我找不到ac#example,它显示了如何在以下条件中引发跨线程事件: 假设我有1个事件和3个线程: 事件DoStuff 线程A – WinForm 线程B – 从线程A产生的线程进行一些处理。 具有订阅DoStuff的Function Foo() 线程C – 从线程B产生的线程进行一些子处理和引发事件DoStuff 现在,我如何确保在线程C中引发的事件是在线程B内而不是C或A中处理的。 我运行的所有示例都提示向Form / Control.Invloke,或者那种类型的东西,我真的想要拥有实际订阅事件的任何线程在它的repsective线程内执行,而不仅仅是主表单线程。

multithreading文件编写

我试图使用多个线程写入大文件的不同部分,就像分段文件下载器一样。 我的问题是,这样做的安全方法是什么? 我是否打开文件进行编写,创建我的线程,将Stream对象传递给每个线程? 我不希望发生错误,因为多个线程可能同时访问同一个对象。 顺便说一下,这是C#。

关于Task.StartNew(Action ,Object)方法

我在这个页面上学习TPL,一个代码块让我很困惑。 我正在阅读此页面: 任务并行(任务并行库) 在一节中,它说下面的代码是正确的解决方案,因为循环中的lambda不能获得每次迭代后变异的值,而是最终值。 所以你应该在CustomData对象中包装“i”。 代码如下: class CustomData { public long CreationTime; public int Name; public int ThreadNum; } public class Example { public static void Main() { // Create the task object by using an Action(Of Object) to pass in custom data // to the Task constructor. This is useful when you need to […]

Thread.Sleep会影响ThreadPool吗?

我需要为自己的目的控制一个线程:计算,等待,报告等… 在所有其他情况下,我正在使用ThreadPool或TaskEx。 在调试器中,当我在做Thread.Sleep() ,我注意到UI的某些部分变得不那么负责了。 虽然,没有调试器似乎工作正常。 问题是:如果我正在创建新的Thread和Sleep() ,它会影响ThreadPool / Tasks吗? 编辑:这是代码示例: 我的应用中的一个随机位置: ThreadPool.QueueUserWorkItem((state) => { LoadImageSource(imageUri, imageSourceRef); }); 我的应用中的另一个随机位置: var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject(resultString, Constants.JsonSerializerSettings)); 我的ConcurrentQueue(修改后,原文取自此处 ): 为队列需要创建线程: public void Process(T request, bool Async = true, bool isRecurssive = false) { if (processThread == null || !processThread.IsAlive) { processThread = new Thread(ProcessQueue); processThread.Name = […]

异步聊天服务器缓冲区问题

有人可以帮我解决这个问题……我一整天都在苦苦挣扎。 所以我正在尝试学习Async套接字,这是给我带来麻烦的东西。 问题基本上就是我与加入聊天室名称的人一起更新ListBox的方式: 基本上我正在做的是让每个客户端在加入服务器时发送“!! addlist [nickname]” 。 它并不理想,因为它不检查重复等,但现在我只想知道为什么它不起作用。 每当有人添加他们以前从未见过的名字时,他们也会发送“!! addlist [nick]” 这样,每次有人加入时,都应该为每个人更新列表。 问题似乎是所有客户端同时开始通信并且它会干扰缓冲区。 我已经尝试为每个客户端使用一个单独的缓冲区,所以这不是问题。 我尝试过使用lock(),但这似乎也没有用。 基本上发生的事情是缓冲区似乎被截断; 哪里有来自同一缓冲区中两个不同人的数据。 请告诉我我在缓冲区或客户端的错误: 请注意,异步套接字使用的是Send而不是BeginSend。 我已经尝试了两种方法,但它们遇到了同样的问题…所以它可能是客户端的? public partial class Login : Form { private ChatWindow cw; private Socket serverSocket; private List socketList; private byte[] buffer; private bool isHost; private bool isClosing; public void startListening() { try { this.isHost = true; //We’re […]

MSBuild BuildInParallel,无法运行的自定义任务生成过程

我正在使用MSBuild任务的BuildInParallel属性来并行运行构建项目。 根项目正在构建四个子项目。 子项目正在使用自定义MSBuild任务,该任务使用System.Diagnostics.Process启动新进程。 由于某些原因,当UseShellExecute为false时,生成的进程无法正常运行。 我不知道为什么会这样,我无法弄清楚错误是什么 – 所有发生的事情都是Process.ExitCode是1,没有exception.. 这是自定义MSBuild任务: using System; using Microsoft.Build.Utilities; using System.Diagnostics; public class MSBuildProcessTask : Task { public string Executable { get; set; } public string Arguments { get; set; } public override bool Execute() { using (var p = new Process()) { try { p.StartInfo = new ProcessStartInfo(Executable, Arguments) { UseShellExecute […]

如何知道线程执行是否终止?

我有一个post: private void start_Click(object sender, EventArgs e) { //… Thread th = new Thread(DoWork); th.Start(); } 知道线程是否被终止的最佳方法是什么? 我正在寻找一个示例代码如何做到这一点。 提前致谢。