Tag: 任务

CancellationTokenSource与Task循环退出的退出标志之间的区别

我想知道结束循环任务与CancellationTokenSource和退出标志之间是否有任何区别 CancellationTokenSource: CancellationTokenSource cancellationTokenSource; Task loopTask; void StartLoop() { cancellationTokenSource = new CancellationTokenSource(); loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); } void Loop() { while (true) { if (cancellationTokenSource.IsCancellationRequested) break; Thread.Yield(); } } void StopLoop() { cancellationTokenSource.Cancel(); loopTask = null; cancellationTokenSource = null; } 退出标志: volatile bool exitLoop; Task loopTask; void StartLoop() { exitLoop = false; loopTask = […]

为什么不抛出这个exception?

我有时会使用一组任务,为了确保它们都在等待我使用这种方法: public async Task ReleaseAsync(params Task[] TaskArray) { var tasks = new HashSet(TaskArray); while (tasks.Any()) tasks.Remove(await Task.WhenAny(tasks)); } 然后像这样调用它: await ReleaseAsync(task1, task2, task3); //or await ReleaseAsync(tasks.ToArray()); 但是,最近我注意到了一些奇怪的行为,并设置了ReleaseAsync方法是否存在问题。 我设法将它缩小到这个简单的演示,如果你包含System.Threading.Tasks它在linqpad中运行。 它也可以在控制台应用程序或asp.net mvc控制器中稍作修改。 async void Main() { Task[] TaskArray = new Task[]{run()}; var tasks = new HashSet(TaskArray); while (tasks.Any()) tasks.Remove(await Task.WhenAny(tasks)); } public async Task run() { return […]

我该怎么做才能在.NET 2.0中使用Task ?

.NET 4.0有TPL,它包含很好的Task类来封装异步编程模型。 我正在开发一个必须是.NET 2.0的应用程序,但我想避免重写Task。 有什么建议?

使用async和await关键字的好处

我是C#中异步方法的新手。 我已经读过这些关键字async并await帮助通过异步某些方法使程序更具响应性。 我有这个片段: 第一道路 public static void Main() { Console.WriteLine(“Hello!! welcome to task application”); Console.ReadKey(); Task ourtask = Task.Factory.StartNew(() => { return “Good Job”; }); ourtask.Wait(); Console.WriteLine(ourtask.Result); Console.ReadKey(); } 第二种方式 public static void Main() { Launch(); } public static async void Launch() { Console.WriteLine(“Hello!! welcome to task application”); Console.ReadKey(); Console.WriteLine(await GetMessage()); Console.ReadKey(); } public static […]

任务并行库中的任务如何影响ActivityID?

在使用任务并行库之前,我经常使用CorrelationManager.ActivityId来跟踪multithreading的跟踪/错误报告。 ActivityId存储在线程本地存储中,因此每个线程都有自己的副本。 这个想法是当你启动一个线程(活动)时,你分配一个新的ActivityId。 ActivityId将使用任何其他跟踪信息写入日志,从而可以单独列出单个“活动”的跟踪信息。 这对于WCF非常有用,因为ActivityId可以转移到服务组件。 这是我正在谈论的一个例子: static void Main(string[] args) { ThreadPool.QueueUserWorkItem(new WaitCallback((o) => { DoWork(); })); } static void DoWork() { try { Trace.CorrelationManager.ActivityId = Guid.NewGuid(); //The functions below contain tracing which logs the ActivityID. CallFunction1(); CallFunction2(); CallFunction3(); } catch (Exception ex) { Trace.Write(Trace.CorrelationManager.ActivityId + ” ” + ex.ToString()); } } 现在,通过TPL,我的理解是多个任务共享线程。 这是否意味着ActivityId很容易在任务中间重新初始化(通过另一项任务)? 是否有新的机制来处理活动追踪?

限制Task.Factory.Start中的任务数量

我已经看过一些关于一次限制任务数量的post( System.Threading.Tasks – 限制并发任务的数量是一个很好的)。 但是,我需要用秒来限制任务数量 – 每秒只有X个任务数量? 有一个简单的方法来实现这一目标吗? 我想创建一个ConcurrentDictionary,关键是当前的第二个,第二个是到目前为止的计数。 如果我们在当前秒为20,那么检查然后停止。 这似乎不是最理想的。 我宁愿每隔1秒/ 20点做一次任务。 有什么想法吗?

为什么Thread.Sleep会影响新任务的创建?

private static void Main(string[] args) { for (int i = 0; i { Thread.Sleep(1000); Console.WriteLine(“hej”); Thread.Sleep(10000); }); } Console.ReadLine(); } 为什么这段代码在一秒钟后不能打印1000次“hej”? 为什么Thread.Sleep(10000)会对代码行为产生影响?

在方法签名中使用async关键字在Web Api端点中返回Task

如果我想通过返回一个Task对象来编写一个非阻塞的web api动作,我可以使用或不使用async关键字这样做: 使用异步 public async Task Get() { Func slowCall = () => { Thread.Sleep(2000); return Request.CreateResponse(HttpStatusCode.OK, “Hello world”); }; var task = Task.Factory.StartNew(slowCall); return await task; } 不使用异步 public Task Get() { Func slowCall = () => { Thread.Sleep(2000); return Request.CreateResponse(HttpStatusCode.OK, “Hello world”); }; var task = Task.Factory.StartNew(slowCall); return task; } 他们都正常工作。 但是,我在编写返回Task的web api操作时看到的每个例子(在线和书籍)都使用async关键字。 […]

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

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冻结,我该如何做以下逻辑?

如果在没有完成任务的情况下超时,Task.Wait(int)是否会停止任务?

我有一个任务,我希望它可以在一秒钟内运行,但如果需要的时间超过几秒钟,我想取消任务。 例如: Task t = new Task(() => { while (true) { Thread.Sleep(500); } }); t.Start(); t.Wait(3000); 请注意,等待3000毫秒后,等待到期。 超时到期或任务是否仍在运行时,任务是否被取消?