Tag: 任务 并行库

为什么C#Parallel.Invoke很慢?

我这样做: private static void Main(string[] args) { var dict1 = new Dictionary(); var dict2 = new Dictionary(); DateTime t1 = DateTime.Now; for (int i = 1; i dict1.Add(i, “Test” + i), () => dict2.Add(i, “Test” + i) ); } TimeSpan t2 = DateTime.Now.Subtract(t1); Console.WriteLine(t2.TotalMilliseconds); Console.ReadLine(); } 所以做一个100万次循环并将项目添加到两个不同的词典。 问题是需要11秒,这比普通顺序方法(没有任务/线程)多5倍,仅需2秒。 不知道为什么。

如何在Parallel.Foreach中处理exception?

我的代码中有一个parallel.Foreach循环,我想知道如何处理exception。 我应该在循环中捕获并处理(例如写入日志)exception,还是应该在外部捕获聚合exception – 在try / catch中包含循环? 最好的祝福

异步等待在调用异步方法时返回Task <List >而不是List

我试图了解异步等待的用法,我研究了一些博客文章,现在我已经制作了一个测试代码,但它没有按照我期望的方式工作。 我有一个返回List的方法: private List GetEmployees() { IList list = new List(); list.Add(new Employee() { Id = 1, Age = 20, Name = “Kavin” }); list.Add(new Employee() { Id = 2, Age = 30, Name = “Alen” }); list.Add(new Employee() { Id = 3, Age = 20, Name = “Suresh” }); list.Add(new Employee() { Id = […]

用于multithreadingWindows服务的线程库

我正在寻找一个好的库,最好是在C#中,我可以在Windows服务中使用它,它将处理所需的所有multithreadingfunction。 该服务将每隔x分钟运行一次,检查数据库是否有要调用的进程,并为每个进程生成一个线程并运行它。 每个线程都应该处理exception,日志记录等。 有什么建议?

如何使用调试器处理任务中的exception?

我在MSDN上研究了这篇文章 ,以及有关此主题的SO的一些问题/答案,但无法理解为什么下面的代码不起作用(在示例控制台应用程序中)。 根据MSDN,预计会抛出AggregateException,它将包含一个带有hello消息的内部exception。 相反,这个helloexception未处理。 它发生在调试器内部。 如果按“继续”或“独立运行”,则按预期工作。 有没有办法避免在VS中一直按下继续? 毕竟, Try…Catch块中的任何内容都被认为是在单线程编程模型中处理的。 否则,调试可能是一场噩梦。 VB.NET Sub Main() Try Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() Catch ex As AggregateException Console.WriteLine(ex.ToString) ‘does not get here until you hit Continue End Try End Sub Private Sub TaskThatThrowsException() Throw New Exception(“hello”) ‘exception was unhandled End Sub C# namespace ConsoleApplication1 { class Program { static void Main(string[] args) […]

如何在multithreading应用程序中安全地使用SmtpClient.SendAsync

在我的应用程序中,我使用Dataflow库中的ActionBlock ,使用SmtpClient.SendAsync()方法发送电子邮件警报,该方法不阻止调用线程。( ActionBlock从BufferBlock获取数据,并使用bufferBlock.LinkTo(actionBlock)绑定块bufferBlock.LinkTo(actionBlock) )。 但是,如果.SendAsync()另一个.SendAsync()调用,则此方法将抛出InvalidOperationException 。 根据MSDN 文档 ,发送操作完成时会引发public event SendCompletedEventHandler SendCompleted 。 我如何确保ActionBlock生成的线程(或Tasks )之间的竞争不会导致抛出InvalidOperationException ? 到目前为止,有一个想法是将我的类(发送电子邮件)添加到SendAsync()调用和将被分配给SendCompleted事件的私有函数的私有锁。 当线程到达SendAsync()它获得锁定,并且当引发事件时,私有函数解锁锁定,允许其他线程获得锁定和进度。

使用长时间运行的后台消费者任务时,Task.Factory.StartNew中的静默exception?

这通知未处理的exception: new Thread(_ => { throw new Exception(); }).Start(); 这没有(至少在你等待/检索结果之前): Task.Factory.StartNew(() => { throw new Exception(); }); 为什么? 发生exception的线程发生了什么? 它死了吗? 这是一个运行任务但不需要其结果或需要等待它的问题,如下所示: _operationQueue = new BlockingCollection(); Task.Factory.StartNew(() => { foreach (var item in _operationQueue.GetConsumingEnumerable()) { // do something that throws } }, TaskCreationOptions.LongRunning); 在这种情况下, _operationQueue处于什么状态? 我知道我可以使用Continition with TaskContinuationOptions.OnlyOnFaulted,你能继续处理吗?

以下代码是否捕获了TPL中原始,继续和子任务的exception?

我正在使用TPL和async / await在我的应用程序的webclient上构建异步API。 很少有地方(通常我需要运行一堆异步任务并最终等待所有这些),我正在关注代码片段。 我只是想确保我正确,因为即使使用TPL编写异步代码相对容易并且async / await 调试/故障排除仍然具有挑战性 (在客户站点上的交互式调试和故障排除问题) – 所以想要正确。 我的目标:能够捕获原始任务,继续任务以及子任务生成的exception,以便我可以处理它(如果需要)。 我不希望任何例外是冷杉和遗忘。 我使用的基本原理: 1.net框架确保将exception附加到任务2.可以将try / catch块应用于async / await以提供同步代码的幻觉/可读性(参考: http://channel9.msdn。 com / Events / TechDays / Techdays-2014-the-Netherlands / Async-programming-deep-dive , http://blogs.msdn.com/b/ericlippert/archive/2010/11/19/asynchrony-in-c- 5-part-seven-exceptions.aspx , http://msdn.microsoft.com/en-us/library/dd537614.aspx等) 问题我想获得批准,我们已经实现了期望的目标(我可以从原始,继续和子任务中捕获exception),并且我可以对样本做任何改进: 例如,是否存在其中一个组合任务(例如,未解包的代理任务)根本不会被激活(waitforactivation状态)的情况,那么waitall可能只是等待任务开始? 我的理解是这些情况永远不会发生,因为延续任务总是执行,并返回由代理使用wnwrap跟踪的任务。 只要我在所有层和apis中遵循类似的模式,模式就应该捕获链接任务中的所有聚合exception。 注意:基本上我正在寻找建议,例如,如果原始任务状态没有运行完成,或者使用附加到父级,那么在继续任务中创建虚拟任务是创建的,这样我只能在父级等上等待才能看到所有可能性以便我可以选择最好的选择,因为这个模式在我的应用程序中严重依赖于error handling。 static void SyncAPIMethod(string[] args) { try { List composedTasks = new List(); //the underlying async […]

如何在任务抛出exception而不等待终结器时使应用程序崩溃

我们在.Net 4(没有异步等待可用)应用程序中使用任务,有时它们用于启动“Fire and Forget”操作,如下所示: private void Test() { Task task = Task.Factory.StartNew(() => { throw new ApplicationException(“Test”); }); } 我们希望此exception在不等待任务的情况下使应用程序崩溃(否则将其置于任务中是没有意义的,至少在我们的场景中)并且不等待终结器,因为我们想要在发生意外错误时关闭应用程序避免状态损坏(我们正在保存exception发生时的状态)。 我的猜测是,不知怎的,我们应该使用延续任务但是将延续代码放在另一个不会使应用程序崩溃的任务中,所以我在这里被阻止了。 任何帮助将非常感谢 编辑:如果切换到ThreadPool,结果是预期的结果。 以下代码崩溃了应用程序: ThreadPool.QueueUserWorkItem((c) => { throw new ApplicationException(“Test”); });

到Task.Run或不运行Task.Run

假设我有一个包含异步方法的接口,我有两个不同的接口实现。 两种实现中的一种是自然异步,而另一种则不是。 实现非异步方法的“最正确”方法是什么? public interface ISomething { Task DoSomethingAsync(); } // Normal async implementation public class Implementation1 : ISomething { async Task ISomething.DoSomethingAsync() { return await DoSomethingElseAsync(); } } // Non-async implementation public class Implementation2 : ISomething { // Should it be: async Task ISomething.DoSomethingAsync() { return await Task.Run(() => DoSomethingElse()); } // Or: async […]