Tag: multithreading

是否所有Web请求都是并行执行的并且是异步处理的?

我正在使用由IIS托管的WebApi服务控制器,我正在尝试理解这种架构是如何工作的: 当WebPage客户端同时发送异步请求时,所有这些请求是否都在WebApi控制器上并行执行? 在IIS应用程序池中,我注意到队列大小设置为1,000默认值 – 这是否意味着1,000个最大线程可以同时在WebApi服务器上并行工作? 或者这个值只与IIS队列有关? 我已经读过IIS维护某种线程队列,这个队列是异步发送它的工作吗? 或者IIS发送给WebApi服务的所有客户端请求是否同步发送?

锁定损坏? 魔术僵局?

我使用multethreading bug。 现在我看到由于某种原因锁定甚至没有被执行但被锁定。 我有下一堂课: public sealed class Foo { private readonly object _lock = new object(); private static ulong _inCnt = 0; public void SomeMethod(ulong poo) { lock (_lock) { _inCnt++; … [some code] } } } 我暂停了VS中的所有线程,检查了所有线程,看到SomeMethod只有一个线程,它正在等待释放lock (_lock) (_inCnt = 0) 。 我恢复线程,等待一段时间,暂停线程并看到相同的图片,同样(并且只有一个)线程仍在等待lock (_lock)的lock (_lock)并且_inCnt为零! 但是如果锁定将会是一个或多个( _inCnt++是lock (_lock)后的第一行lock (_lock)不会发生exception,我们不会中止线程)。 如何将其锁定为零并锁定?

如何处理MVVM中并行化任务的ObservableCollection 结果?

我在一个单独的Task中收集数据,我想使用ObservableCollection将数据绑定到GUI组件。 所以我的代码是这样的: private ObservableCollection _items; public ObservableCollection Items { get { return _items; } set { if (_items.Equals(value)) { return; } _items = value; RaisePropertyChanged(“Items”); } } private void LoadData() { Task task = Task.Factory.StartNew(() => { ObservableCollection itms = _htmlParser.FetchData(…); Dispatcher.CurrentDispatcher.Invoke((Action)delegate { Items = itms; }); }); } 从执行某些HTTP请求的组件中获取数据。 我得到的错误是: Must create DependencySource on […]

collections被修改; 枚举操作可能无法执行。 锁在哪里可用?

这是一个只有我正在编写和使用的小程序。 现在我要编写所有使用导致此问题的hashset的区域的代码 我不明白这是怎么可能的。 此项目仅在MainWindow中使用 hsProxyList是一个哈希集 HashSet hsProxyList = new HashSet(); 错误发生在下面的迭代中 lock (hsProxyList) { int irRandomProxyNumber = GenerateRandomValue.GenerateRandomValueMin(hsProxyList.Count, 0); int irLocalCounter = 0; foreach (var vrProxy in hsProxyList) { if (irLocalCounter == irRandomProxyNumber) { srSelectedProxy = vrProxy; break; } irLocalCounter++; } } } 我使用hsProxyList的其他地方 我在计算时没有锁定对象 – 我想这不会导致任何错误,但可能不正确 – 不重要 lblProxyCount.Content = “remaining proxy count: ” […]

易变性和只读是否相互排斥?

假设我正在设计一个包装内部集合的线程安全类: public class ThreadSafeQueue { private readonly Queue _queue = new Queue(); public void Enqueue(T item) { lock (_queue) { _queue.Enqueue(item); } } // … } 基于我的另一个问题 ,上面的实现是错误的,因为当它的初始化与其使用同时执行时可能会出现种族危险: ThreadSafeQueue tsqueue = null; Parallel.Invoke( () => tsqueue = new ThreadSafeQueue(), () => tsqueue?.Enqueue(5)); 上面的代码是可接受的非确定性的:该项目可能会或可能不会入队。 但是,在当前的实现中,它也被破坏了,并且可能引起不可预测的行为,例如抛出IndexOutOfRangeException , NullReferenceException ,多次排队同一项,或者陷入无限循环。 这是因为Enqueue调用可能在将新实例分配给局部变量tsqueue之后但在内部_queue字段的初始化完成(或似乎完成)之前运行。 Per Jon Skeet : Java内存模型不能确保构造函数在将新对象的引用分配给实例之前完成 。 Java内存模型经历了1.5版的重新加工,但是在没有volatile变量的情况下,双重检查锁定仍然被破坏( […]

Task.ContinueWith()父任务不等待子任务完成

由于我在嵌套任务的上下文中理解了Task ,我真的不明白 – 为什么第二次打印之前的第3次打印? 即使我使用了Task.WaitAll(t) ,它Task.WaitAll(t)在第二行之前打印第3行。 码: public static void Main() { Task t = new Task( () => { Thread.Sleep(2000); Console.WriteLine(“1st print…”); }); t.ContinueWith( x => { Thread.Sleep(2000); Console.WriteLine(“2nd print…”); }, TaskContinuationOptions.OnlyOnRanToCompletion); t.Start(); Task.WaitAll(t); Console.WriteLine(“3rd print…”); Console.Read(); } 输出:

为什么没有抓住这个例外?

我正在尝试运行以下代码: class Program { static void Main(string[] args) { var task = Task.Factory.StartNew(() => { throw new ApplicationException(“message”); }); try { task.ContinueWith(t => Console.WriteLine(“End”)); } catch (AggregateException aex) { Console.Write(aex.InnerException.Message); } } } 我预计Exception将被捕获​​在以下位置: catch (AggregateException aex) { Console.Write(aex.InnerException.Message); } 但这不会发生。 为什么会这样?

将参数传递给线程

我想传递一个函数,该函数将参数传递给C#中的ThreadStart构造函数。 但是,似乎这是不可能的,因为我得到一个语法错误,我尝试做这样的事情 Thread t1 = new Thread(new ThreadStart(func1(obj1)); 其中obj1是List类型的对象(比如说)。 如果我想要一个线程来执行这个接受一个对象作为参数的函数,并且我打算用不同的参数值同时创建2个这样的线程,那么实现这个的最佳方法是什么?

如何使用CancellationTokenSource关闭另一个线程上的对话框?

这与我的其他问题如何取消后台打印有关 。 我试图更好地理解CancellationTokenSource模型以及如何跨线程边界使用它。 我有一个主窗口(在UI线程上)后面的代码: public MainWindow() { InitializeComponent(); Loaded += (s, e) => { DataContext = new MainWindowViewModel(); Closing += ((MainWindowViewModel)DataContext).MainWindow_Closing; }; } 它在关闭时正确调用CloseWindow代码: private void CloseWindow(IClosable window) { if (window != null) { windowClosingCTS.Cancel(); window.Close(); } } 通过选择菜单项,在后台线程上创建第二个窗口: // Print Preview public static void PrintPreview(FixedDocument fixeddocument, CancellationToken ct) { // Was cancellation already requested? […]

尝试重新启动线程时发生ThreadStateException

尝试重新启动线程时,我不时会收到System.Threading.ThreadStateException。 有问题的代码如下: // Make sure the thread is done stopping while (this.mThread.ThreadState == ThreadState.Running) { Thread.Sleep(0); } // Respawn a thread if the current one is stopped or doesn’t exist if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped) { this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); } // Start the thread if (check) { this.mThread.Start(60000); } else […]