Tag: multithreading

每隔几分钟在global.asax中执行一次方法

每隔x分钟在Global.asax文件中执行方法的最有效方法是什么? 有没有办法让ASP.NET服务器运行一个后台线程,在一段经过的时间后触发一个tick事件?

启动线程时的不同行为:ParameterizedThreadStart与Anonymous Delegate。 为什么这有关系?

当我运行下面的代码时,输​​出是“DelegateDisplayIt”,通常重复1-4次。 我已经运行了这个代码大概100次,并且没有一次输出曾经是“ParameterizedDisplayIt”。 因此,似乎创建并随后启动线程的方式会影响参数的传递方式。 使用匿名委托创建新线程时,该参数是对原始变量的引用,但是当使用ParameterizedThreadStart委托创建时,该参数是一个全新的对象? 我的假设是否正确? 如果是这样,这似乎是线程构造函数的一个奇怪的副作用,不是吗? static void Main() { for (int i = 0; i < 10; i++) { bool flag = false; new Thread(delegate() { DelegateDisplayIt(flag); }).Start(); var parameterizedThread = new Thread(ParameterizedDisplayIt); parameterizedThread.Start(flag); flag = true; } Console.ReadKey(); } private static void DelegateDisplayIt(object flag) { if ((bool)flag) Console.WriteLine("DelegateDisplayIt"); } private static void ParameterizedDisplayIt(object […]

什么是使用ThreadPool的正确方法?

如果我对ThreadPool的工作方式的理解是正确的,那么其目的之一是限制在给定时间可以创建的进程中的工作线程数。 例如,如果将MaxThreads设置为5然后调用QueueUserWorkItem 30次,则将向ThreadPool发出30个请求,但这些请求中只有5个将由新线程提供服务,而其他25个请求将被添加到队列中并且当先前的请求完成并且现有线程变得可用时,一次服务一个。 但是,在下面的代码中,对Thread.Sleep(-1)的调用保证DoSomething()方法永远不会返回,这意味着当前线程永远不会对后续请求可用。 但是我对ThreadPool工作方式的理解是不正确的,因为如果它是正确的,下面的代码只打印数字0-4而不是0-29。 有人可以解释ThreadPool如何工作以及为什么下面的代码没有做我认为它应该做的事情? static void DoSomething(object n) { Console.WriteLine(n); Thread.Sleep(-1); } static void Main(string[] args) { ThreadPool.SetMaxThreads(5, 5); for (int x = 0; x < 30; x++) { ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x); } Console.Read(); }

.NET BackGroundWorker – InvalidOperationException:跨线程操作无效

我有一个用.NET Winforms编码的项目。 我需要实现数据挖掘操​​作,将文本打印到TextBox并更新进度。 我尝试使用BackgroundWorker来做,但是它抛出了一个InvalidOperationException( 跨线程操作无效:控件’xxxxx’从其创建的线程以外的线程访问 ) 为了缩小问题的潜在原因,我开始了一个新项目,包括以下内容:按钮 – 启动BackgroundWorker标签 – 打印文本。 和ProgressBar。 但是,结果是一样的。 我搜索了SOF,并被告知要使用代表,但我不熟悉它。 这是抛出错误的代码示例: using System; using System.Collections.Generic; using System.ComponentModel; namespace TestProject { public partial class Form1 : Form { private readonly BackgroundWorker _bw = new BackgroundWorker(); public Form1() { InitializeComponent(); _bw.DoWork += RosterWork; _bw.ProgressChanged += BwProgressChanged; _bw.RunWorkerCompleted += BwRunWorkerCompleted; _bw.WorkerReportsProgress = true; _bw.WorkerSupportsCancellation […]

在.NET ThreadPool中停止所有线程?

我在.NET中使用ThreadPool在后台发出一些Web请求,我希望有一个“停止”按钮来取消所有线程,即使它们正在发出请求,所以一个简单的bool不会这样做工作。 我怎样才能做到这一点?

INotifyPropertyChanged导致跨线程错误

这是我的观点: 我有一个绑定到BindingList的GridControl。 起初我正在做的是创建一个工作线程并直接访问BindingList,但这是一个“检测到跨线程操作”,所以我按照这里的指南: http://www.devexpress.com/Support/Center/p/AK2981.aspx 通过将原始BindingList克隆到工作线程并更改那个,我得到了预期的效果。 但是,我最近将INotifyPropertyChanged实现到了绑定到BindingList的对象中,然后我又开始收到错误。 我的猜测是GridView仍在从对象中侦听INotifyPropertyChanged。 我怎样才能解决这个问题? 我的课: public class Proxy : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } }

这个Singleton实现是正确的还是线程安全的?

这个单例实现是正确的还是线程安全的? class Class { public static readonly Class Instance; static Class() { Instance = new Class(); } private Class() {} }

C#使用ThreadPool执行方法(带参数)

我们有以下代码(在本网站上找到此代码的想法),它将为方法“Do_SomeWork()”生成新线程。 这使我们能够异步多次运行该方法。 代码是: var numThreads = 20; var toProcess = numThreads; var resetEvent = new ManualResetEvent(false); for (var i = 0; i < numThreads; i++) { new Thread(delegate() { Do_SomeWork(Parameter1, Parameter2, Parameter3); if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); }).Start(); } resetEvent.WaitOne(); 但是我们想要使用ThreadPool而不是创建我们自己的新线程,这可能对性能有害。 问题是如何修改上面的代码以使用ThreadPool,记住方法“Do_SomeWork”采用多个参数并且还具有返回类型(即方法不是void)。 此外,这是C#2.0。

从Form1作为父级的异步线程调用MessageBox

单击form1上的button1后,程序正在检查新版本是否可用(通过互联网),但是在新线程中执行此操作(在检查期间不冻结表单)。 当找到新版本时,会显示相应的MessageBox ,但它没有父级(因为它是从线程调用的,而不是直接从form1调用的)。 如何使用form1作为父级显示MessageBox ?

async / await – 这种理解是否正确?

经过两个问题和混乱 – 我想知道我是否最终做对了。 这是我的理解: async/await 仅用于一个目的 – 允许在已完成异步任务后执行代码。 例如 async Task CallerMethod() { await AsyncMethod(); AnotherMethod(); } 允许在异步AsyncMethod 完成后执行AsyncMethod ,而不是在AsyncMethod 启动后立即AsyncMethod 。 async / await NEVER 使任何异步。 它不会启动一个单独的线程(除非等待的方法当然会这样做),等等。 我的理解(最后)是否正确?