Tag: multithreading

为什么在UI线程上输入锁定会触发OnPaint事件?

我遇到了一些我根本不理解的东西。 在我的应用程序中,我有几个线程都将项添加(和删除)到共享集合(使用共享锁)。 UI线程使用计时器,并在每个tick上使用集合来更新其UI。 由于我们不希望UI线程长时间保持锁定并阻止其他线程,我们这样做的方式是,首先我们获取锁,我们复制集合,然后释放锁,然后在我们的副本上工作。 代码如下所示: public void GUIRefresh() { ///… List tmpList; lock (Locker) { tmpList = SharedList.ToList(); } // Update the datagrid using the tmp list. } 虽然它工作正常,但我们注意到应用程序有时会出现速度减慢,当我们设法捕获堆栈跟踪时,我们看到了: …. at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe) at MyDataGrid.OnPaint(PaintEventArgs pe) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) […]

Func .BeginInvoke是否使用ThreadPool?

当您在C#中调用Func委托(或Action代理)上的BeginInvoke方法时,运行时是否使用ThreadPool或生成新线程? 我几乎可以肯定它会使用ThreadPool,因为这是合乎逻辑的事情,但如果有人能证实这一点,我会很感激。 谢谢,

如何在C#(托管代码)中获得* THREAD *的CPU使用率和/或RAM使用率?

我知道如何获得进程的CPU使用率和内存使用率,但我想知道如何在每个线程级别上获取它。 如果最好的解决方案是做一些P-Invoking,那也没关系。 我需要的例子: Thread myThread = Thread.CurrentThread; // some time later in some other function… Console.WriteLine(GetThreadSpecificCpuUsage(myThread));

以非阻塞方式调用TaskCompletionSource.SetResult

我发现了TaskCompletionSource.SetResult(); 在返回之前调用等待任务的代码。 在我的情况下,导致死锁。 这是一个在普通Thread启动的简化版本 void ReceiverRun() while (true) { var msg = ReadNextMessage(); TaskCompletionSource task = requests[msg.RequestID]; if(msg.Error == null) task.SetResult(msg); else task.SetException(new Exception(msg.Error)); } } 代码的“异步”部分看起来像这样。 await SendAwaitResponse(“first message”); SendAwaitResponse(“second message”).Wait(); Wait实际上嵌套在非异步调用中。 SendAwaitResponse(简化) public static Task SendAwaitResponse(string msg) { var t = new TaskCompletionSource(); requests.Add(GetID(msg), t); stream.Write(msg); return t.Task; } 我的假设是第二个SendAwaitResponse将在ThreadPool线程中执行,但它会在为ReceiverRun创建的线程中继续。 无论如何设置任务的结果而不继续等待代码? 该应用程序是一个控制台应用程

为什么Thread和Task之间的性能差异如此之大?

Windows 7,Intel CORE i3,64位,RAM 4Gb,2.27 GHz .NET Framework 4.0 我有以下代码: static void Main(string[] args) { var timer = new Stopwatch(); timer.Start(); for (int i = 0; i { }); new Thread(() => { }).Start(); } timer.Stop(); Console.WriteLine(timer.Elapsed.TotalSeconds); Console.ReadLine(); } 如果我使用Task,输出总是小于0.01秒 ,但如果我使用Thread,输出总是大于40秒 ! 这怎么可能? 为什么这么大的差异?

如何使用数据绑定进行处理并保持GUI刷新?

问题的历史 这是我之前的问题的延续 如何启动线程以保持GUI刷新? 但是,由于Jon对这个问题有了新的认识,我将不得不完全重写原始问题,这会使该主题难以理解。 所以,新的,非常具体的问题。 问题 两件: CPU饥饿的重量级处理作为库(后端) 带有数据绑定的WPF GUI,用作处理的监视器(前端) 当前情况 – 库发送了很多关于数据更改的通知,尽管它在自己的线程中工作,它完全阻塞了WPF数据绑定机制,结果不仅监视数据不起作用(它没有刷新),但整个GUI被冻结在处理数据时。 目标 – 精心设计,抛光的方式保持GUI最新 – 我不是说它应该立即显示数据(它甚至可以跳过一些更改),但它不能在进行计算时冻结。 例 这是简化示例,但它显示了问题。 XAML部分: Start C#部分(请注意这是一个代码,但它有两个部分): public partial class MainWindow : Window,INotifyPropertyChanged { // GUI part public MainWindow() { InitializeComponent(); DataContext = this; } private void Button_Click(object sender, RoutedEventArgs e) { var thread = new Thread(doProcessing); thread.IsBackground = […]

multithreading是否会提高单处理器的计算速度

在单个处理器上,multithreading是否会增加计算速度。 众所周知,multithreading用于提高用户响应能力,并通过分离UI线程和计算线程来实现。 但是让我们谈谈控制台应用程序。 multithreading是否会提高计算速度。 当我们通过multithreading计算时,我们是否能更快地得到计算结果。 那么在多核上,multithreading会不会增加速度。 请帮我。 如果您有任何材料可以了解有关线程的更多信息。 请发布。 编辑:我被问到一个问题,在任何给定的时间,只允许一个线程在一个核心上运行。 如果是这样,为什么人们在控制台应用程序中使用multithreading。 哈尔莎,提前谢谢

.NET https跨线程使用不同安全协议的请求

我维护一个非常复杂的ASP.NET应用程序(一个定制的NopCommerce 3.10)。 它需要在不同的场景下通过HTTPS连接到第三方服务器。 我是通过HttpWebRequest类来做到这一点的。 其中一些服务器配置不当: 其中一个第三方服务器(例如服务器A )需要SSL3协议类型,如果设置了其他协议类型,则只会使连接失败。 如果使用SSL3执行连接,则另一台服务器(例如服务器B )提供不正确的证书。 更确切地说,它提供了具有错误CN(通用名称)的证书。 但是,如果我从一开始就使用TLS ,证书就可以了。 我使用ServicePointManager.ServerCertificateValidationCallback回调确定了上述问题,以检查SSL策略错误。 更改安全协议是通过ServicePointManager.SecurityProtocol完成的,这是一个静态属性。 但是,客户端对我的应用程序执行的触发上述HTTPS连接的请求可能碰巧在不同的线程中并行运行。 如果我,例如:将安全协议设置为所需类型,执行HTTPS请求,然后将其设置回服务器A ,我无法保证如果同时需要连接到服务器B的请求不更改ServicePointManager.SecurityProtocol指向服务器A所需的值以外的值。 我相信这是静态变量的典型multithreading问题。 根据我的研究,我确定.NET没有为每个WebRequest实例提供使用特定SSL协议的方法。 我正在考虑以下解决方案: 排队应用程序内的所有传出HTTPS连接,以确保每个连接都有正确的SSL协议 为每个HTTPS请求构建一个单独的应用程序域(由https://stackoverflow.com/a/3107692/1288522建议) 将HTTPS请求更改为低级TCP连接,并为每个TCP连接强制执行不同的SSL协议 制作一个代理asp.net应用程序,它将对传出请求进行排队 注意:排队不会造成巨大的性能损失,因为所有客户端请求的一小部分实际上都会到达相关代码。 然而,考虑到应用程序架构或粗略的解决方法(第三种解决方案),上述解决方案需要进行困难的重构 我的问题与msdn上的这个非常类似,但是没有得到满意的答案。 是否有更直接或有效的方法来确保每个https请求使用特定的SSL协议?

.NET中的可变新鲜度保证(易失性与易失性读取)

我读过很多关于volatile和VoletileRead(ReadAcquireFence)的矛盾信息(msdn,SO等)。 我理解那些内存访问重新排序的限制含义 – 我仍然完全混淆的是新鲜度保证 – 这对我来说非常重要。 msdn doc for volatile提及: (…)这可确保始终在字段中显示最新值。 用于volatile字段的msdn doc提及: 读取volatile字段称为volatile读取。 易失性读取具有“获取语义”; 也就是说,保证在指令序列之后的任何内存引用之前发生。 VolatileRead的.NET代码是: public static int VolatileRead(ref int address) { int ret = address; MemoryBarrier(); // Call MemoryBarrier to ensure the proper semantic in a portable way. return ret; } 根据msdn MemoryBarrier doc内存屏障阻止重新排序。 然而,这似乎对新鲜度没有任何影响 – 对吗? 那怎样才能获得保鲜? 标记字段volatile与使用VolatileRead和VolatileWrite语义访问它有区别吗? 我目前正在执行我的性能关键代码,需要保证新鲜度,但读者有时会得到陈旧的价值。 我想知道如果标记状态不稳定会使情况不同。 EDIT1: […]

使用async和await关键字的好处

我是C#中异步方法的新手。 我已经读过这些关键字async并await帮助通过异步某些方法使程序更具响应性。 我有这个片段: 第一道路 public static void Main() { Console.WriteLine(“Hello!! welcome to task application”); Console.ReadKey(); Task ourtask = Task.Factory.StartNew(() => { return “Good Job”; }); ourtask.Wait(); Console.WriteLine(ourtask.Result); Console.ReadKey(); } 第二种方式 public static void Main() { Launch(); } public static async void Launch() { Console.WriteLine(“Hello!! welcome to task application”); Console.ReadKey(); Console.WriteLine(await GetMessage()); Console.ReadKey(); } public static […]