Tag: multithreading

为什么这个任务早点返回? 我做错了什么吗?

我正在尝试建立一些具有一些最小耦合的工作者,但我想使用C# async和任务。 并非所有任务都是纯粹的异步(有些将是完全同步的)。 这样做的动机是我想创建一些执行业务逻辑的简单方法,并使用System.Threading.Tasks.Task API将它们链接在一起,以保留一些排序概念。 基本上,我想创建第一个任务,注册一些延续,然后等待最终任务完成。 这是我构建的简单原型,看看我想做什么甚至可以工作: void Main() { var worker = new Worker(); var work = worker.StartWork(1, 2000); work.ConfigureAwait(false); var final = work.ContinueWith(_ => worker.StartWork(2, 0)) .ContinueWith(ant => worker.StartWork(3, 1500)); var awaiter = final.ContinueWith(_ => Tuple.Create(_.Id, _.Status)); Console.WriteLine(“\”final\” completed with result {0}”, awaiter.Result); Console.WriteLine(“Done.”); } // Define other methods and classes here class […]

C#编译器优化和volatile关键字

我已经阅读了一些关于volatile关键字和没有此关键字的行为的post。 我特别测试了C#中说明volatile关键字用法的答案代码。 运行时,我会在发布模式下观察exception行为,不附加调试器。 到目前为止,没有问题。 所以,据我所知,以下代码永远不会退出。 public class Program { private bool stopThread; public void Test() { while (!stopThread) { } // Read stopThread which is not marked as volatile Console.WriteLine(“Stopped.”); } private static void Main() { Program program = new Program(); Thread thread = new Thread(program.Test); thread.Start(); Console.WriteLine(“Press a key to stop the thread.”); Console.ReadKey(); […]

紧凑框架上的线程的AsyncCallback

我需要在紧凑的框架应用程序中实现线程来改善加载时间。 我想触发一个后台线程来调用外部API,而主线程缓存一些表单。 当后台线程完成后,我需要启动另外两个线程来填充数据缓存。 我需要后台线程能够执行回调方法所以我知道它已经完成并且可以启动接下来的两个线程,但是在紧凑框架中不支持委托上的BeginInvoke方法,那么我还能怎样做呢?

如何使Win服务长期运行线程

我有一个win服务托管一些我需要长时间运行的工作流程(WorkflowApplication和WorkflowServiceHost)。 因为OnStart()要求它完成并返回到操作系统,所以我有一个主方法可以触发线程池中的另一个线程。 我的Onstart()主要看起来像这样 protected override void OnStart(string[] args) { eventLog.WriteEntry(“Service starting…”); ThreadPool.QueueUserWorkItem(new WaitCallback(ServiceMainThread)); Thread.Sleep(100); eventLogCms.WriteEntry(“Service Started.”); } ServiceMainThread()是我的工作流程执行和实现核心function的方法。 当我在Windows 7机器上启动服务时,它运行然后在大约8分钟后死亡。 在Win Server 2008上,线程永远不会执行。 所以我认为我已经错误地实现了线程,而且什么是ServiceMainThread有点不对劲。 我愿意接受有关可以改进的建议或任何方向的建议,因为我刚接触线程.Net。 ServiceMainThread中的基本线程代码编码如下: private void ServiceMainThread(object state) { // .. execute workflows .. eventLog.WriteEntry(“Workflows executed.”); while(alive) { Thread.Sleep(1); // … check workflow states and ensure they’re still executing … } // .. […]

“必须在与DependencyObject相同的线程上创建DependencySource”时创建GridView

我有一个线程问题。当我想在另一个线程中将一个GridView设置为ListView作为View时。它显示一条消息,其中显示: 必须在与DependencyObject相同的Thread上创建DependencySource。 // Create grid view GridView grid = new GridView(); // Add column // Name grid.Columns.Add((GridViewColumn)myresourcedictionary[“gridDirFileName”]); // Type grid.Columns.Add((GridViewColumn)myresourcedictionary[“gridDirFileType”]); // Data Modified grid.Columns.Add((GridViewColumn)myresourcedictionary[“gridDirFileDataModified”]); // Size grid.Columns.Add((GridViewColumn)myresourcedictionary[“gridDirFileSize”]); // Edit view Application.Current.Dispatcher.Invoke(new Action(() => ListViewOp.View = grid)); 我在做什么?

multithreadingexception和Dispose。 为什么Dispose没有打电话?

‘using’语句保证对象将被称为Dispose方法。 在这个例子中,这没有发生。 终结者方法也没有调用。 为什么这一切? 当其他线程上的exception发生时,我如何更改代码以保证处理我的对象? class Program { static void Main(string[] args) { Thread th1 = new Thread(ThreadOne); Thread th2 = new Thread(ThreadTwo); th1.Start(); th2.Start(); th1.Join(); th2.Join(); } static void ThreadOne() { using (LockedFolder lf = new LockedFolder(@”C:\SomeFodler”)) { // some pay load Thread.Sleep(5000); } } static void ThreadTwo() { // some pay load Thread.Sleep(1000); […]

使用ThreadPool.QueueUserWorkItem对线程进行排序

我是线程基础知识的新手。 我有一个操作队列要对XML文件执行(节点添加,节点删除等) 1]有’n’xml文件,并且对于每个文件,使用ThreadPool.QueueUserWorkItem分配来自线程池的线程来执行这些文件操作。 我想使用线程实现并发和操作顺序(重要)。 例如:假设要对文件“A.xml”执行操作[a1,a2,a3,a4,a5] 和操作[b1,b2,b3,b4,b5,b6,b7]将在文件“B.xml”上执行….. 我想分配线程,以便我可以执行这些操作 相同的顺序,也同时(因为文件不同)。 2]也可以为每个操作分配一个线程并实现可靠性并保持顺序。 在STA模型中我做了类似的事情.. while(queue.count>0){ File f = queue.Dequeue(); //get File from queue OperationList oprlst = getOperationsForFile(f); // will get list-> [a1,a2,a3,a4,a5] for each Operation oprn in oprlst { performOperation(f,oprn) //in MTA i want to wait till operation “a1” completes and then operation “a2” will //start.making threads wait till […]

在C#中取消/中止任务

我在C#中有一个程序可以进行一些服务调用。 我需要在此程序中添加一些代码,以便能够在单击按钮(winform)时停止这些服务调用[例如,如果调用太长而用户感到无聊]。 困难在于我无法修改执行调用的代码块。 为了做到这一点,我计划用Unity Framework做一些拦截。 我想在每次输入服务调用代码块时创建一个Task。 然后,如果用户单击我的按钮,则取消此任务。 我看过CancellationToken,但问题是我无法修改调用块,所以我不能做if(ct.IsCancellationRequested)或ct.ThrowIfCancellationRequested(); AutoResetEvent和ManualResetEvent也是一样的。 调用并不总是异步并且使用了cancelToken,因此我认为捕获OperationCanceledException是不可能的。 我也看过使用Threads并做一些Thread.Abort()但这种方法似乎每次有人调用时都会杀死小狗。 这是我当前程序的一个示例(拦截尚未实现,我想先在一次调用中测试它): private void Test() { Task.Factory.StartNew(MyServiceCallFunction); // How to cancel the task when I press a button ? } // Can’t touch the inside of this function : private void MyServiceCallFunction() { // Blabla I prepare the datas for the call // Blabla I […]

如何在C#中传输数据包时正确保持UI更新?

我有这种forms,它产生一个新的线程,并开始侦听并等待循环中的UDP数据包。 我需要的是保持UI更新接收的字节数。 为此,我设置了一个事件,我会在收到数据包后立即提出这个事件并将接收到的字节数作为参数传递。 由于我没有在UI线程上运行,我不能简单地直接更新UI。 这是我目前正在做的事情: private void EVENTHANDLER_UpdateTransferProgress(long receivedBytes) { if(InvokeRequired) { Invoke(new MethodInvoker(() => { totalReceivedBytes += receivedBytes; Label.Text = totalReceivedBytes.ToString(“##,0”); })); } } 但这仍然在与数据包接收循环相同的线程上运行,并且它不会返回到该循环 – 并等待另一个数据包 – 直到此EVENTHANDLER_UpdateTransferProgress方法返回。 我的问题基本上是关于上述方法中的以下行: Label.Text = totalReceivedBytes.ToString(“##,0”); 像这样更新UI会减慢数据包接收速度。 如果我取消该行(或评论它),数据包接收将更快。 我怎么可能解决这个问题? 我认为更multithreading是关键,但我不确定如何在这种情况下正确实现它们……我正在使用带有.NET 2.0的Windows Forms。 编辑: 在我之前的测试中,上述情况似乎是正确的,实际上可能在某种程度上。 但经过一些测试后,我意识到问题出在整个Invoke(new MethodInvoker(() => { … })); 事情。 当我删除它(当然不会更新UI)并离开EVENTHANDLER_UpdateTransferProgress但继续提升事件时,数据包接收速度要快得多。 我测试了接收一些文件,平均大约需要1.5秒,而不需要在事件处理程序上调用Invoke() 。 当我在事件处理程序中调用Invoke()时,即使没有更新UI中的任何控件或执行任何操作(换句话说,匿名方法体是空的),它花费的时间更长,约为5.5秒。 你可以看到它有很大的不同。 反正有没有改善这个?

如何在不轮询ThreadState的情况下判断线程是否已完成执行?

是否有一种优雅的方式来了解工作线程何时完成执行,以便我可以访问它生成的资源? 例如,如果工作线程使用查询SQL Server列表 ServersSqlDataSourceEnumerator.Instance.GetDataSources(); 并将结果保存在DataTable变量中,我可以使用什么机制来了解此DataTable变量何时已填充/可用。 我不想轮询ThreadState; 当事件完成时触发事件是理想的,这样我就可以对结果执行操作。 谢谢!