Tag: multithreading

如何在Windows Phone上运行并行任务?

我正在构建一个WP8应用程序,我需要执行大约30个Web请求。 这些请求不依赖于彼此,因此可以并行化。 我的代码看起来像这样(简化/伪代码): foreach (Uri uri in uris) { var rawData = await Task.Run(() => httpClient.GetStringAsync(uri).ConfigureAwait(false)); var processedData = dataProcessor.Process(rawData); processedDataCollection.Add(processedData); } 当我看到Fiddler时,请求全部都是sequantial; 它需要几秒钟来执行和处理所有这些。 但是,我不希望代码等到1个请求完成后才转移到下一个请求,我想同时执行多个请求。 通常我会使用Parallel.Invoke()或Parallel.ForEach()或类似的东西来执行此操作,但显然并行库在Windows Phone 8中不可用。 那么实现这一目标的最佳方法是什么? Task.Factory.StartNew() ? new Thread() ?

IOC DImultithreading生命周期范围在后台任务中

我有一个使用IOC和DI来创建和注入服务的应用程序。 我有一个处理一些业务逻辑的服务层,在服务层我有一个与数据库通信的存储库。 该存储库使用的是非线程安全的DataContext。 我想使用后台任务异步运行服务上的一些函数,但是知道这会导致存储库出现问题。 因此,我希望为每个创建的后台线程创建存储库。 这是如何实现的? 我正在使用StructureMap作为IoC。 public class Service : IService { IRepository _repository; public Service(IRepository repository) { this._repository = repository; } public void DoSomething() { // Do Work _repository.Save(); } } public class Controller { IService _service; public Controller(IService service) { this._service = service; } public Action DoSomethingManyTimes() { for(int i =0; i […]

C#使用调用线程,冻结表单

我正在尝试使用线程并防止程序在线程繁忙时冻结。 它应该显示进度(写入0/1)并且不仅仅是在完成后显示结果,同时冻结表格。 在当前程序中,我正在尝试写入文本框,实际上看到不断进展,并且表单不会受到其他线程任务的影响。 我现在拥有的是我可以使用调用写入带有线程的文本框,但它只显示结果(表单在线程繁忙时冻结),并且表单冻结。 表格图片: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace MultiThreading { public partial class MultiThreading : Form { public MultiThreading() { InitializeComponent(); } Thread writeOne, writeTwo; private void writeText(TextBox textBox, string text) { if (textBox.InvokeRequired) { textBox.BeginInvoke((MethodInvoker)delegate() { for (int […]

Thread.Sleep(2500)与Task.Delay(2500).Wait()

我想要澄清一下。 我知道Task.Delay将在内部使用Timer,它显然是基于任务的(等待),而Thread.Sleep将导致线程被阻止。 但是,在任务上调用.Wait会导致线程被阻塞吗? 如果没有,可以假设Task.Delay(2500).Wait()优于Thread.Sleep(2500) 。 这与我正在调用的SO问题/答案略有不同.Wait() 。

防止所有者垃圾收集的线程

在我创建的库中,我有一个类DataPort,它实现类似于.NET SerialPort类的function。 它与某些硬件进行通信,并且只要数据通过该硬件进入就会引发事件。 为了实现此行为,DataPort会旋转一个预期与DataPort对象具有相同生命周期的线程。 问题是当DataPort超出范围时,它永远不会被垃圾收集 现在,因为DataPort与硬件(使用pInvoke)对话并拥有一些非托管资源,所以它实现了IDisposable。 当您在对象上调用Dispose时,一切都正常。 DataPort摆脱了所有非托管资源并杀死了工作线程并消失了。 但是,如果您只是让DataPort超出范围,垃圾收集器将永远不会调用终结器,并且DataPort将永远保留在内存中。 我知道这种情况有两个原因: 终结器中的断点永远不会被击中 SOS.dll告诉我DataPort仍然存在 补充:在我们继续前进之前,我会说是的,我知道答案是“Call Dispose()Dummy!” 但我认为,即使你让所有引用超出范围, 最终应该发生正确的事情,垃圾收集器应该摆脱DataPort 回到问题:使用SOS.dll,我可以看到我的DataPort没有被垃圾回收的原因是因为它旋转的线程仍然具有对DataPort对象的引用 – 通过隐含的“this”参数线程正在运行的实例方法。 正在运行的工作线程不会被垃圾回收 ,因此在正在运行的工作线程范围内的任何引用也不符合垃圾回收的条件。 线程本身基本上运行以下代码: public void WorkerThreadMethod(object unused) { ManualResetEvent dataReady = pInvoke_SubcribeToEvent(this.nativeHardwareHandle); for(;;) { //Wait here until we have data, or we got a signal to terminate the thread because we’re being disposed int signalIndex = […]

ThreadPool.QueueUserWorkItem的意外行为

请查看下面的代码示例: public class Sample { public int counter { get; set; } public string ID; public void RunCount() { for (int i = 0; i < counter; i++) { Thread.Sleep(1000); Console.WriteLine(this.ID + " : " + i.ToString()); } } } class Test { static void Main() { Sample[] arrSample = new Sample[4]; for (int i […]

MultiThreading错误:已经有一个与此Connection关联的打开DataReader,必须先关闭它

我有一个Parallel.Foreach循环 var options = new ParallelOptions(); options.MaxDegreeOfParallelism = 1; Parallel.ForEach(urlTable.AsEnumerable(),drow => { using (var WCC = new MasterCrawlerClass()) { WCC.MasterCrawlBegin(drow); } } 这个循环调用类并循环遍历我的所有DataRows,但是每个数据行都执行DataTable填充,或者对MySQL DB执行更新命令。 我对这两个代码的代码如下。 private static DataTable DTTable(string mysqlQuery, string queryName) { DataTable DTTableTable = new DataTable(); try { MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection); DataTable DataDTTablesDT = new DataTable(); DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); […]

C#:在单独的Thread中调用 .InvokeMember()方法

我正在使用此代码,我在调用从dll动态加载的类的List的run方法: for (int i = 0; i < robotList.Count; i++) { Type t = robotList[i]; //robotList is a List object o = Activator.CreateInstance(t); t.InvokeMember(“run”, BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null); } invokeMember正在调用列表中每个类的run方法。 现在我如何在一个单独的线程中从invokeMember调用这个run方法 ? 这样我就可以为每个被调用的方法运行单独的线程。

从Thread.Start()的委托函数访问返回值

我有一个程序通过Thread.Start执行一个方法。 该方法具有我想要访问的返回值。 有没有办法做到这一点? 这是一个抽样…… var someValue = “”; Thread t = new Thread(delegate() { someValue = someObj.methodCall(); }); t.Start(); while (t.isAlive) Thread.Sleep(1000); // Check the value of someValue 因此,一旦while循环结束,someValue应该被设置 – 但是因为它在另一个线程中执行它不会被设置。 有一种简单的方法可以访问它吗?

为什么InvokeRequired比WindowsFormsSynchronizationContext更受欢迎?

任何时候初学者都会问: 如何从C#中的另一个线程更新GUI? ,答案很简单: if (foo.InvokeRequired) { foo.BeginInvoke(…) } else { … } 但使用它真的很好吗? 在非GUI线程执行foo.InvokeRequired , foo的状态可以改变。 例如,如果我们在foo.InvokeRequired之后关闭表单,但在foo.BeginInvoke之前,调用foo.BeginInvoke将导致InvalidOperationException : 在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke。 如果我们在调用InvokeRequired之前关闭表单,则不会发生这种情况,因为即使从非GUI线程调用它也是false 。 另一个例子:假设foo是一个TextBox 。 如果你关闭表单,之后非GUI线程执行foo.InvokeRequired (这是假的,因为表单已关闭)和foo.AppendText它将导致ObjectDisposedException 。 相反,在我看来,使用WindowsFormsSynchronizationContext要容易得多 – 只有当线程仍然存在时,才会使用Post发布回调,如果线程不再存在,则使用Send同步调用Send抛出InvalidAsynchronousStateException 。 是不是更容易使用WindowsFormsSynchronizationContext ? 我错过了什么吗? 如果它不是真的线程安全,为什么我应该使用InvokeRequired-BeginInvoke模式? 你觉得哪个更好?