Tag: task parallel library

了解TaskScheduler.Current的行为

这是一个简单的WinForms应用程序: using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private async void button1_Click(object sender, EventArgs e) { var ts = TaskScheduler.FromCurrentSynchronizationContext(); await Task.Factory.StartNew(async () => { Debug.WriteLine(new { where = “1) before await”, currentTs = TaskScheduler.Current, thread = […]

在C#中使用async而不等待?

考虑在没有等待的情况下使用async 。 想想也许你误解了异步的作用。 警告是完全正确的:如果您将方法标记为异步但不在任何地方使用等待,那么您的方法将不是异步的。 如果你调用它,方法中的所有代码将同步执行。 我想编写一个应该运行异步但不需要使用await的方法。例如在使用线程时 public async Task PushCallAsync(CallNotificationInfo callNotificationInfo) { Logger.LogInfo(“Pushing new call {0} with {1} id”.Fill(callNotificationInfo.CallerId, } 我想调用PushCallAsync并运行异步,不想使用等待。 我可以在C#中使用async而不等待吗?

在Parallel.For中发送多个WebRequest

我想发送多个WebRequest 。 我使用Parallel.For循环来做到这一点,但循环运行一次,第二次在获得响应时出错。 错误: 操作已超时 代码: Parallel.For(0, 10, delegate(int i) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create( new Uri(“http://www.mysite.com/service”)); string dataToSend = “Data”; byte[] buffer = System.Text.Encoding.GetEncoding(1252). GetBytes(dataToSend); request.Method = “POST”; request.ContentType = “application/x-www-form-urlencoded”; request.ContentLength = buffer.Length; request.Host = “www.mysite.com”; Stream requestStream = request.GetRequestStream(); requestStream.Write(buffer, 0, buffer.Length); requestStream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); });

如何使用异步方法正确编写Parallel.For

我将如何构造下面的代码,以便调用异步方法? Parallel.For(0, elevations.Count(), delegate(int i) { allSheets.AddRange(await BuildSheetsAsync(userID, elevations[i], includeLabels)); });

任务链(等待上一个任务完成)

var tasks = new List(); foreach (var guid in guids) { var task = new Task( …); tasks.Add(task); } foreach (var task in tasks) { task.Start(); Task.WaitAll(task); } 这是UI线程的运行。 我需要一个接一个地执行任务变量中的所有任务。 问题是如果我调用Task.WaitAll(任务),UI冻结。 如果没有UI冻结,我该如何做以下逻辑?

我想等待抛出AggregateException,而不仅仅是第一个Exception

等待故障任务(具有exception集的任务)时, await将重新抛出存储的exception。 如果存储的exception是AggregateException ,它将重新抛出第一个并丢弃其余的exception。 我们如何使用await并同时抛出原始的AggregateException以便我们不会意外丢失错误信息? 注意,当然可以考虑使用hacky解决方案(例如,围绕await尝试catch,然后调用Task.Wait )。 我真的希望找到一个干净的解决方案。 这里最好的做法是什么? 我想过使用自定义awaiter,但内置的TaskAwaiter包含了许多魔法,我不知道如何完全重现。 它调用TPL类型的内部API。 我也不想重现所有这些。 如果你想玩它,这是一个简短的repro: static void Main() { Run().Wait(); } static async Task Run() { Task[] tasks = new[] { CreateTask(“ex1”), CreateTask(“ex2”) }; await Task.WhenAll(tasks); } static Task CreateTask(string message) { return Task.Factory.StartNew(() => { throw new Exception(message); }); } 在Run只抛出两个exception中的一个。 请注意,Stack Overflow上的其他问题无法解决此特定问题。 建议重复时请小心。

异步/等待,自定义awaiter和垃圾收集器

我正在处理托管对象在async方法中过早完成的情况。 这是一个业余爱好的家庭自动化项目(Windows 8.1,.NET 4.5.1),我向非托管第三方DLL提供C#回调。 在某个传感器事件时调用回调。 要处理事件,我使用async/await和一个简单的自定义awaiter(而不是TaskCompletionSource )。 我这样做的部分原因是为了减少不必要的分配数量,但主要是出于好奇心作为学习练习。 下面是我所拥有的非常剥离的版本,使用Win32计时器队列计时器来模拟非托管事件源。 让我们从输出开始: 按Enter退出… 服务员() 打勾:0 打勾:1 〜Awaiter() 打勾:2 打勾:3 打勾:4 请注意我的等待者在第二次打勾后如何最终确定。 这是出乎意料的。 代码(控制台应用程序): using System; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication { class Program { static async Task TestAsync() { var awaiter = new Awaiter(); //var hold = GCHandle.Alloc(awaiter); WaitOrTimerCallbackProc callback = (a, b) => […]

.Net TPL:具有任务优先级的有限并发级别任务调度程序?

我目前正在使用这里详细介绍的LimitedConcurrencyLevelTask​​Scheduler http://msdn.microsoft.com/en-us/library/ee789351.aspx 我希望对此进行增强,以便为个人任务分配优先级。 这些优先级不需要映射到线程优先级。 它应该只影响任务的启动顺序。 有谁知道这样一个任务调度程序的例子? (很多调度的东西都在我头上,所以如果有现有的解决方案会很棒)

具有异步lambda和Task.WaitAll的Task.Factory.StartNew

我正在尝试在任务列表中使用Task.WaitAll 。 事情是任务是一个异步lambda,它打破Tasks.WaitAll因为它永远不会等待。 这是一个示例代码块: List tasks = new List(); tasks.Add(Task.Factory.StartNew(async () => { using (dbContext = new DatabaseContext()) { var records = await dbContext.Where(r => r.Id = 100).ToListAsync(); //do long cpu process here… } } Task.WaitAll(tasks); //do more stuff here 这不会因为异步lambda而等待。 那我该如何等待我的lambda中的I / O操作呢?

返回Task的接口的同步实现

类似于在同步代码中实现需要Task返回类型的接口,虽然我很好奇我是否应该忽略编译器错误,而是我的情况生成。 假设我有这样的界面: public interface IAmAwesome { Task MakeAwesomeAsync(); } 在某些实现中,使用async和await async完成可以带来很多好处。 这实际上是接口试图允许的内容。 在其他情况下,也许很少见,只需要一个简单的同步方法来制作真棒。 所以让我们假设实现如下: public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { // Some really awesome stuff here… } } 这有效,但编译器警告: 这种方法缺少’await’运算符并将同步运行。 考虑使用await运算符等待非阻塞API调用,或者’await TaskEx.Run(…)’在后台线程上执行CPU绑定工作。 编译器实际上是在建议这个解决方案: public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { await Task.Run(() => { // Some […]