Tag: task parallel library

ASP.NET WebApi中的Fire-forget和单向调用

我完全理解HTTP世界不是单向调用的最佳选择,WebApi最适合HTTP冗长通信。 毫无疑问,WCF是这里的赢家。 但是,如果你已经有一个暴露了一堆动词的ApiController怎么办呢?在某些时候你也需要一个单向调用呢? 并且您不希望为此托管/维护另一个服务(WCF)。 Task response = client.PostAsJsonAsync(“api/log”, log) 如果您没有处理响应,那么您将获得类似于“即发即忘”的内容。 这是WebApi中的唯一方法还是另一种解决方案?

Task.Faulted和Task.Exception

TaskStatus Enum或Task.Exception MSDN似乎都没有明确表示: TasksStatus.Faulted总是暗示Task.Exception != null (和TaskStatus != Faulted Task.Exception == null总是暗示Task.Exception == null )?

如何使用CancellationToken取消任务?

所以我有这个代码: //CancelationToken CancellationTokenSource src = new CancellationTokenSource(); CancellationToken ct = src.Token; ct.Register(() => Console.WriteLine(“Abbruch des Tasks”)); //Task Task t = new Task(() => { System.Threading.Thread.Sleep(1000); if (ct.IsCancellationRequested) { try { //Throw ct.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine( “ThrowIfCancellationRequested() liefert eben eine Exception”); } } }, ct); //Run Task and Cancel t.Start(); src.CancelAfter(350); t.Wait(); // Get […]

并行处理的dependency injection

我正在尝试练习手动dependency injection(还没有框架)来删除我的代码中的紧耦合。 这只是为了练习 – 我没有考虑具体的实现。 到目前为止,简单的构造函数注入工作正常。 但是当一个类必须在并行循环中使用另一个类时,我无法解决如何解决创建紧耦合的问题。 例: public class Processor { private IWorker worker; public Processor(IWorker worker) { this.worker = worker; } public List DoStuff() { var list = new List(); for (int i = 0; i < 10; i++) { list.Add(worker.GetString()); } return list; } public List DoStuffInParallel() { var list = new […]

使用Action 创建任务

我不知何故觉得我错过了一些基本的东西。 这是我的问题。 我正在尝试创建一个System.Threading.Tasks.Task实例来执行接受某种类型参数的操作。 我以为我可以做点什么 void DoWork(MyClass obj) {} //My action that accepts a parameter of type ‘MyClass’ MyClass obj = new MyClass(); Action action = DoWork; //action that points to the method Task task = new Task(action,obj); //task that would execute ‘DoWork’ with ‘obj’ as the parameter when I call Start. 显然这不会编译。 似乎我只能对一个任务使用Action而不是Action ,然后在我的方法中将’object’强制转换为T. 如何才能最有效,最有效地实现我想要的目标?

线程阻止UI

我是在Nutshell中关注C#的一个例子。 根据文本,下面的代码应该是非阻塞的,但我发现表单将在5秒钟后才会显示。 private void Form1_Load(object sender, EventArgs e) { var tcs = new TaskCompletionSource(); new Thread(() => {Thread.Sleep(5000); tcs.SetResult(42); }).Start(); Task task = tcs.Task; MessageBox.Show(task.Result.ToString()); } 我觉得这与Thread.Sleep()有关,而不是让新线程处于hibernate状态,而是让主线程处于hibernate状态。 为什么它会阻止UI线程?

从Task.WhenAll获得结果

我有多个任务返回我想要使用Task.WhenAll(new[]{t1,t2,t3});调用的相同对象类型Task.WhenAll(new[]{t1,t2,t3}); 并阅读结果。 当我尝试使用时 Task<List> all = await Task.WhenAll(new Task[] { t, t2 }).ConfigureAwait(false); 我收到编译器错误 无法将类型’void’隐式转换为’System.Threading.Tasks.Task<System.Collections.Generic.List> 这两个任务都是类似的调用方法。 private Task<List> GetFiles(string path) { files = new List(); return Task.Run(() => { //remove for brevity return files; }); }

C#任务是否在一个核心上运行?

C#任务是否在一个核心上运行? 我有一个项目,我需要决定要创建多少个任务。 我需要创建尽可能多的计算机。 这是处理器,核心或逻辑处理器的数量,我在三个选项之间感到困惑。

MaxDegreeOfParallelism = Environment.ProcessorCount减慢了CPU的执行时间

我有以下程序(我从http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx获得 )使用Parallel.For循环拆分任务 class Program { static void Main(string[] args) { var watch = Stopwatch.StartNew(); Parallel.For(2, 20, (i) => { var result = SumRootN(i); Console.WriteLine(“root {0} : {1} “, i, result); }); Console.WriteLine(watch.ElapsedMilliseconds); Console.ReadLine(); } public static double SumRootN(int root) { double result = 0; for (int i = 1; i < 10000000; i++) { result […]

有没有`Task.Delay`的变体在实时通过后到期,例如即使系统被暂停和恢复?

我有一种情况,我觉得在现实世界中等待一段时间的周期性动作之间有一段延迟,而不是等待系统时钟嘀嗒几次。 通过这种方式,我可以更新在不同系统上跟踪的租约/在实际经过一段时间后实时超时。 我怀疑Task.Delay可能已经有这种行为,但我想确定,所以我写了一个测试程序(见下文)。 我的发现是,当系统挂起并恢复时, Task.Delay行为完全不同。 从观察其行为开始, Task.Delay就像它一样: 将计数器设置为通过此时间量所需的计时器滴答数。 每次计时器滴答时计数器减少。 当计数器达到0时,标记为已完成。 有没有办法以这样一种方式await我可以在经过一定量的实时后运行任务,这样如果系统或进程在延迟过期后恢复,我的继续可以被触发? 现在,作为一种解决方法,只要Task.Delay过期或SystemEvents.PowerModeChanged触发Resume ,我就会Resume 。 这是处理这种情况的正确方法吗? 对于我来说,用这种方式编写两个用于不同目的的API似乎很奇怪,我惊讶地发现SystemEvents.PowerModeChanged存在。 另外,我担心这个API在Microsoft.Win32命名空间中可能不是可移植的。 实验 using Microsoft.Win32; using System; using System.Threading.Tasks; class Program { static int Main(string[] args) => new Program().Run(args).Result; async Task Run(string[] args) { SystemEvents.PowerModeChanged += (sender, e) => Console.WriteLine($”{e}: {e.Mode}”); var targetTimeSpan = TimeSpan.FromSeconds(20); var start = DateTime.UtcNow; var […]