Tag: multithreading

暂停下载线程

我在c#中编写了一个非常简单的批量下载程序,它读取要下载的URL的.txt文件。 我已经设置了一个全局线程和委托来更新GUI,按下“开始”按钮创建并启动该线程。 我想要做的是有一个“暂停”按钮,让我暂停下载,直到我点击“恢复”按钮。 我该怎么做呢? 相关代码: private Thread thr; private delegate void UpdateProgressCallback(int curFile); private void Begin_btn_Click(object sender, EventArgs e) { thr = new Thread(Download); thr.Start(); } private void Pause_btn_Click(object sender, EventArgs e) { Pause_btn.Visible = false; Resume_btn.Visible = true; //{PAUSE THREAD thr} } private void Resume_btn_Click(object sender, Eventargs e) { Pause_btn.Visible = true; Resume_btn.Visible = […]

实现无锁队列(对于Logger组件)

我正在设计一个新的改进的Logger组件(.NET 3.5,C#)。 我想使用无锁实现。 记录事件将从(可能)多个线程发送,尽管只有一个线程将实际输出到文件/其他存储介质。 从本质上讲,所有编写器都将它们的数据排入某个队列,然后由其他一些进程(LogFileWriter)进行检索。 这可以通过无锁方式实现吗? 我无法在网上找到这个特定问题的直接参考。

如何使用ASP.Net MVC中的Task重定向到某个操作

我有一个异步控制器实现如下, public Task UpdateUser(ProfileModel model) { return Task.Factory.StartNew(showMethod).ContinueWith( t => { return RedirectToAction(“ViewUser”,”UserProfile”); }); } 但是我无法重定向到操作,因为我一直在收到错误, 无法将类型 System.Threading.Taska.Task 隐式转换 为 System.Threading.Taska.Task 但是我真的想重定向到上面提到的Action,我该怎么做呢。

C#COM Cross Thread

我们正在开发一种控制科学测量设备的软件。 它提供了一个COM接口定义了几个函数来设置测量参数,并在测量数据时触发事件。 为了测试我们的软件,我正在实现该设备的模拟。 com-object运行一个循环,定期触发事件。 客户端应用程序中的另一个循环现在应该使用给定的函数设置com-simulator。 我创建了一个用于测量参数的类,在设置新测量时将对其进行实例化。 // COM-Object public class MeasurementParams { public double Param1; public double Param2; } public class COM_Sim : ICOMDevice { public MeasurementParams newMeasurement; IClient client; public int NewMeasurement() { newMeasurment = new MeasurementParam(); } public int SetParam1(double val) { // why is newMeasurement null when method is called from client […]

无需中止或挂起即可立即终止无环线程

我正在实现一个协议库。 这是一个简化的描述。 主函数中的主线程将始终检查网络流上是否有某些数据(在tcpclient中)。 让我们说响应是收到的消息,而线程是一个正在运行的线程。 thread = new Thread(new ThreadStart(function)); thread.IsBackground = true; thread.Start(); while(true){ response = receiveMessage(); if (response != null) { thread.Suspend(); //I am searching for an alternative for the line above and not thread.Abort(). thread2 = new Thread(new ThreadStart(function2)); thread2.IsBackground = true; thread2.Start(); } } 到目前为止一切顺利,在while循环中实际上有更多的消息,并且还有一个用于处理不同类型的传入消息的状态机,但这应该足够了。 (还有不仅仅是函数“function”和“function2”)。 所以无论如何这些函数在这个应用程序中看起来都不清楚,因为协议是程序员隐藏的并且意味着它是一个库。 这意味着协议将启动一些程序员定义的函数作为线程,具体取决于程序在协议中的状态。 因此,如果接收到特殊响应(例如callAnotherFunction消息),我想突然终止一个线程(此处命名为“thread”),让我们说在100毫秒内。 但是我不知道它是在一个循环内执行还是没有循环,并且在它终止之前需要多少处理。 如何在不弃用Suspend或Exceptionthrowing Abort函数的情况下停止这些线程? […]

如何在每个循环周期中一步更新进度条? C#

在C#,windows窗体中创建.net应用程序。 如何在100循环循环的每个循环中更新进度条1步? (我正在处理循环中的excel表。)进度条控件位于UI类中,该类连接到连接到自定义类(MVC模式)的控制器类。 循环在自定义类中。 我是否需要在每种方法中一直向下发送UI类实例,还是有更好的方法? 现在,循环结束后进度条会更新。 Application.doevents和.update或.refresh不起作用。

System.Windows.Forms.Timer没有触发

我想使用System.Windows.Forms.Timer来确保在我正在创建的excel插件的UI线程上触发事件。 我按如下方式构建计时器: private System.Windows.Forms.Timer _timer; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Debug.WriteLine(“ThisAddIn_Startup:” + Thread.CurrentThread.ManagedThreadId); _timer = new System.Windows.Forms.Timer(); _timer.Tick += new EventHandler(TimerEventHandler); _timer.Interval = 500; } 计时器由我正在使用的库中的COM事件触发: private void OnEvent() { _timer.Start(); } 然后我希望_timer在_timer时调用以下方法: public void TimerEventHandler(object sender, EventArgs args) { _timer.Stop(); Debug.WriteLine(“Tick: ” + Thread.CurrentThread.ManagedThreadId); } 据我所知,当我在Addin线程中创建计时器时,即使它是从另一个线程启动的(在这种情况下是COM事件),它应该触发它创建的线程,即插件线程。 但是,这不会发生。 我已经在我过去编写的RTDServer实现了这个确切的机制( 如Kenny Kerr所述 ),并且它按预期工作,但此场景中的_timer永远不会_timer 。 […]

.NET线程 – HttpWebRequest BeginGetResponse + AutoResetEvent

我想知道两者中的哪种方法是更好的实现? 我需要创建一个范围在200到5秒之间的Web请求。 我需要继续执行html响应 – 所以需要在主线程上阻塞。 第一种方法 string GetResponse() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); IAsyncResult result = request.BeginGetResponse(null, null); using (HttpWebResponse httpResponse = (HttpWebResponse)request.EndGetResponse(result)) { using (Stream dataStream = httpResponse.GetResponseStream()) { StreamReader reader = new StreamReader(dataStream); response = reader.ReadToEnd(); } } 第二种方法 string response = string.Empty; AutoResetEvent waitHandle = null; void GetResponse(string url) { waitHandle = […]

从WPF中的后台工作者更新进度条

我正在尝试使用BackgroundWorker进行进度条前进。 最终目标是显示后台搜索的进度,但我首先想要通过简单的模拟来了解进度条。 这是代码: public MainWindow() { InitializeComponent(); worker = new BackgroundWorker(); // variable declared in the class worker.WorkerReportsProgress = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); worker.RunWorkerCompleted += worker_RunWorkerCompleted; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.Title += ” DONE”; } private void worker_DoWork(object sender, DoWorkEventArgs e) { for(int j = 0; […]

使用不带Invoke的MethodInvoker

我现在正在编写GUI应用程序一段时间,我总是使用一个方法是使用MethodInvoker + lambda函数来进行跨线程访问。 从示例中我发现我总是看到这样的东西: 版本1 if (InvokeRequired) { Invoke(new MethodInvoker(() => { Label1.Text = “Foobar”; }); } else { Label1.Text = “Foobar”; } 然而,这会导致代码重复 – >对我来说是主要的坏人。 那有什么不对呢? 版本2 MethodInvoker updateText = new MethodInvoker(() => { Label1.Text = “Foobar”; }); if (InvokeRequired) { Invoke(updateText); } else { updateText(); } 现在我将function捆绑在一个变量中,并在适当时使用Invoke或函数指针调用它。 版本2的性能更差吗? 或者我使用匿名函数是不好的做法?