Tag: multithreading

System.Threading.Timer的可伸缩性如何?

我正在编写一个需要使用Timer的应用程序,但可能还有很多。 System.Threading.Timer类的可伸缩性如何? 文档只是说它“轻量级”,但没有进一步解释。 这些计时器是否被吸入代表Timer处理所有回调的单个线程(或非常小的线程池),或者每个Timer都有自己的线程? 我想另一种重新解释这个问题的方法是: System.Threading.Timer是如何实现的?

如何显示带有Dictionary的TryGetValue的双重检查锁模式不是线程安全的

最近我看到一些在Dictionary上使用双重检查锁定模式的C#项目。 像这样的东西: private static readonly object _lock = new object(); private static volatile IDictionary _cache = new Dictionary(); public static object Create(string key) { object val; if (!_cache.TryGetValue(key, out val)) { lock (_lock) { if (!_cache.TryGetValue(key, out val)) { val = new object(); // factory construction based on key here. _cache.Add(key, val); } } } […]

ConcurrentBag Vs List

使用ConcurrentBag(Of MyType)而不使用List(Of MyType)有什么好处? CB上的MSDN页面说明了这一点 ConcurrentBag(Of T)是一个线程安全的包实现,针对同一个线程生成和消耗存储在包中的数据的场景进行了优化 那有什么好处呢? 我可以理解Concurrency命名空间中其他集合类型的优点,但是这个让我很困惑。

Async / Await与WinForms ProgressBar

我已经使用BackgroundWorker在过去使用过这种类型的东西,但我想使用.NET 4.5的新异步/等待方法。 我可能正在咆哮错误的树。 请指教。 目标 :创建一个组件,该组件将执行一些长时间运行的工作,并在执行工作时显示带有进度条的模态表单。 该组件将获取窗口的句柄,以便在执行长时间运行的工作时阻止交互。 状态 :请参阅下面的代码。 在我尝试与windows进行交互之前,我认为自己做得很好。 如果我把事情单独处理(即不要触摸!),一切都“完美”运行,但是如果我点击任一窗口,那么程序会在长时间运行结束后挂起。 忽略实际交互(拖动),就像UI线程被阻止一样。 问题 :我的代码可以很容易修复吗? 如果是这样,怎么样? 或者,我应该使用不同的方法(例如BackgroundWorker)吗? 代码 (Form1是带有ProgressBar和公共方法的标准表单,UpdateProgress,用于设置ProgressBar的值): using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine(“Starting..”); var mgr = new Manager(); mgr.GoAsync(); Console.WriteLine(“..Ended”); Console.ReadKey(); } } class Manager { private static […]

NetworkStream.Read()和NetworkStream.BeginRead()之间的区别?

我需要从NetworkStream读取,它会随机发送数据,数据包的大小也会不断变化。 我正在实现一个multithreading应用程序,其中每个线程都有自己的流来读取。 如果流上没有数据,应用程序应该一直等待数据到达。 但是,如果服务器完成了发送数据并终止了会话,那么它应该退出。 最初我使用了Read方法从流中获取数据,但它曾用于阻塞线程并一直等待直到数据出现在流上。 MSDN上的文档建议, 如果没有可用于读取的数据,则Read方法返回0.如果远程主机关闭连接,并且已收到所有可用数据,则Read方法立即完成并返回零字节。 但就我而言,我从未让Read方法返回0并正常退出。 它只是无限期地等待。 在我的进一步调查中,我遇到了BeginRead ,它BeginRead流并在收到数据后立即异步调用回调方法。 我也试图使用这种方法寻找各种实现,但是,我无法确定何时使用BeginRead是有益的而不是Read 。 在我看来, BeginRead具有异步调用的优势,它不会阻塞当前线程。 但是在我的应用程序中,我已经有一个单独的线程来读取和处理来自流的数据,所以这对我来说没什么大不了的。 任何人都可以帮我理解BeginRead的等待和退出机制,它与Read有何不同? 实现所需function的最佳方法是什么?

Async / Await使用Task.Run异步启动新线程吗?

我已经阅读了很多文章,但仍然无法理解这一部分。 考虑以下代码: private async void button1_Click(object sender, EventArgs e) { await Dosomething(); } private async Task Dosomething() { await Task.Run((() => “Do Work”)); return “I am done”; } 第一个问题: 当我单击按钮时,它将调用DoSomething并等待通过调用Task.Run(如果我没有记错)从线程池创建线程的任务,并且所有这些都以异步方式运行。 所以我实现了创建一个完成我的工作但是异步执行的线程? 但是考虑到我不需要任何结果,我只是希望在没有得到任何结果的情况下完成工作,是否真的需要使用async / await,如果是这样,怎么样? 第二个问题: 在异步运行线程时,它是如何工作的? 它是在主UI上运行但是在单独的线程上运行还是在单独的线程上运行并且在该方法中是异步的?

字符串属性本身是线程安全的吗?

C#中的字符串是不可变的和线程安全的。 但是当你有一个公共吸气剂属性时呢? 像这样: public String SampleProperty{ get; private set; } 如果我们有两个线程,第一个是调用’get’而第二个是在“相同”时调用’set’,会发生什么? 恕我直言,该集必须锁定为线程安全,如下所示: private string sampleField; private object threadSafer = new object(); public String SampleProperty{ get{ return this.sampleField; } private set{ lock(threadSafer){ sampleField = value; } } }

如何在带有参数的线程中调用该方法并返回一些值

我喜欢在带有参数的线程中调用该方法,并在此处返回一些值示例 class Program { static void Main() { Thread FirstThread = new Thread(new ThreadStart(Fun1)); Thread SecondThread = new Thread(new ThreadStart(Fun2)); FirstThread.Start(); SecondThread.Start(); } public static void Fun1() { for (int i = 1; i = 6; i–) { Console.WriteLine(“Fun2 writes:{0}”, i); } } } 我知道上面的例子运行成功,但如果方法fun1像这样 public int fun1(int i,int j) { int k; k=i+j; return […]

在另一个线程中运行WPF控件

我在我的项目中使用了一个可视化控件,它来自一个我没有源代码的库。 更新(大约200毫秒)以获得良好的UI响应时间需要很长时间,其中三个控件同时在屏幕上显示。 (我可能需要一次更新所有三个,这使得我的UI在他们都在思考的时候停留了大约600毫秒)。 我已经阅读了一些关于TaskSchedulers的post,并开始研究并行任务function,作为在自己的线程中运行每个控件的一种方式。 该平台将是多核的,所以我想利用同步处理。 问题是我甚至不知道我不知道如何解决这个问题。 是否有合适的设计模式用于在WPF中的主UI线程的单独线程中运行控件? 具体来说 :它是第三方地图控件,当给定新位置或缩放级别时需要太长时间才能重绘(~200ms)。 或许其中有三个更新最高为4Hz – 显然他们无法跟上.. 我已经在用户控件中封装了WPF控件,并且需要在它自己的线程中运行每个实例,同时仍然捕获用户输入(例如,鼠标点击)。 更新 :当我感觉到解决方案时,到目前为止我已经实现了以下内容。 我的主(UI)线程产生一个线程,该线程创建一个包含相关控件的新窗口,并将其定位在正确的位置(这样它看起来只是一个普通的控件)。 _leftTopThread = new Thread(() => { _topLeftMap = new MapWindow() { WindowStartupLocation = WindowStartupLocation.Manual, Width = leftLocation.Width, Height = leftLocation.Height, Left = leftLocation.X, Top = leftLocation.Y, CommandQueue = _leftMapCommandQueue, }; _topLeftMap.Show(); System.Windows.Threading.Dispatcher.Run(); }); _leftTopThread.SetApartmentState(ApartmentState.STA); _leftTopThread.IsBackground = true; _leftTopThread.Name = […]

C#Threading / Async:在UI可交互的情况下在后台运行任务

在浏览Async / Await和Threading之后,我仍然不确定将它应用于我的情况的正确方法。 无论我尝试我的UI的变化仍然挂起,因为我似乎不是异步调用我想要的函数,另外,我可能实际上需要线程为我的解决方案。 我正在尝试做的事情:我有一个WPF应用程序,其中有一个按钮,我想开始一个操作,仍然允许通过UI或其他方式与程序交互。 一旦满足在此函数之外确定的条件,该函数应该结束。 对我来说,这听起来相当标准,但我有一种感觉,我误解了一些东西,我已经错误地实现了它。 我现在拥有的: private async void start_button_Click(object sender, RoutedEventArgs e) { await StaticClass.MyFunction(); } private void stop_button_Click(object sender, RoutedEventArgs e) { StaticClass.stopFlag = true; } public static Task myFunction() { //Stuff Happens while(StaticClass.stopFlag == false) //Do Stuff //Stuff Happens return Task.FromResult(1) //I know this is bad, part of the reason […]