原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://cnn237111.blog.51cto.com/2359144/1102476
- Task(Action)
- Task<TResult>(Func<TResult>)
- static void Main(string[] args)
- {
- Task Task1 = new Task(() => Console.WriteLine("Task1"));
- Task1.Start();
- Console.ReadLine();
- }
- static void Main(string[] args)
- {
- Task Task1=Task.Run(() => { Thread.Sleep(5000);
- Console.WriteLine("Foo");
- Thread.Sleep(5000);
- });
- Console.WriteLine(Task1.IsCompleted);
- Task1.Wait();//阻塞当前线程
- Console.WriteLine(Task1.IsCompleted);
- }
- static void Main(string[] args)
- {
- Task Task1=Task.Run(() => { Thread.Sleep(5000);
- Console.WriteLine("Foo");
- Thread.Sleep(5000);
- });
- Console.WriteLine("Task1.IsCompleted:{0}",Task1.IsCompleted);
- bool b=Task1.Wait(2000);
- Console.WriteLine("Task1.IsCompleted:{0}", Task1.IsCompleted);
- Console.WriteLine(b);
- Thread.Sleep(9000);
- Console.WriteLine("Task1.IsCompleted:{0}", Task1.IsCompleted);
- }
- static void Main(string[] args)
- {
- Task<int> Task1 = Task.Run<int>(() => { Thread.Sleep(5000); return Enumerable.Range(1, 100).Sum(); });
- Console.WriteLine("Task1.IsCompleted:{0}",Task1.IsCompleted);
- Console.WriteLine("Task1.IsCompleted:{0}", Task1.Result);//如果方法未完成,则会等待直到计算完成,得到返回值才运行下去。
- Console.WriteLine("Task1.IsCompleted:{0}", Task1.IsCompleted);
- }
- static void Main(string[] args)
- {
- try
- {
- Task<int> Task1 = Task.Run<int>(() => { throw new Exception("xxxxxx"); return 1; });
- Task1.Wait();
- }
- catch (Exception ex)//error的类型为System.AggregateException
- {
- Console.WriteLine(ex.StackTrace);
- Console.WriteLine("-----------------");
- Console.WriteLine(ex.InnerException.StackTrace);
- }
- }
- static void Main(string[] args)
- {
- TaskScheduler.UnobservedTaskException += UnobservedTaskException;
- Task.Run<int>(() => { throw new Exception("xxxxxx"); return 1; });
- Thread.Sleep(1000);
- }
- static void UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
- {
- Console.WriteLine(e.Exception.Message);
- Console.WriteLine(e.Exception.InnerException.Message);
- }
- static void Main(string[] args)
- {
- TaskScheduler.UnobservedTaskException += UnobservedTaskException;
- Task.Run<int>(() => { throw new Exception("xxxxxx"); return 1; });
- Thread.Sleep(1000);
- GC.Collect();
- GC.WaitForPendingFinalizers();
- }
- static void Main(string[] args)
- {
- Task<int> Task1 = Task.Run<int>(() => { return Enumerable.Range(1, 100).Sum(); });
- var awaiter = Task1.GetAwaiter();
- awaiter.OnCompleted(() =>
- {
- Console.WriteLine("Task1 finished");
- int result = awaiter.GetResult();
- Console.WriteLine(result); // Writes result
- });
- Thread.Sleep(1000);
- }
- static void Main(string[] args)
- {
- Task<int> Task1 = Task.Run<int>(() => {return Enumerable.Range(1, 100).Sum(); });
- Task1.ContinueWith(antecedent => {
- Console.WriteLine(antecedent.Result);
- Console.WriteLine("Runing Continue Task");
- });
- Thread.Sleep(1000);
- }
- public class TaskCompletionSource<TResult>
- {
- public void SetResult (TResult result);
- public void SetException (Exception exception);
- public void SetCanceled();
- public bool TrySetResult (TResult result);
- public bool TrySetException (Exception exception);
- public bool TrySetCanceled();
- ...
- }
- static void Main(string[] args)
- {
- var tcs = new TaskCompletionSource<int>();
- new Thread(() => {
- Thread.Sleep(5000);
- int i = Enumerable.Range(1, 100).Sum();
- tcs.SetResult(i); }).Start();//线程把运行计算结果,设为tcs的Result。
- Task<int> task = tcs.Task;
- Console.WriteLine(task.Result); //此处会阻塞,直到匿名线程调用tcs.SetResult(i)完毕
- }
- Task<TResult> Run<TResult>(Func<TResult> function)
- {
- var tcs = new TaskCompletionSource<TResult>();
- Thread t = new Thread(() =>
- {
- try { tcs.SetResult(function()); }
- catch (Exception ex) { tcs.SetException(ex); }
- });
- t.IsBackground = true;
- t.Start();//启动线程
- return tcs.Task;
- }
- Task<int> task = Run(() => { Thread.Sleep(5000); return Enumerable.Range(1, 100).Sum(); });
- Console.Write(task.Result);//这句会阻塞当前线程,直到task的result值被赋值才行。
- static Task<int> delayFunc()
- {
- var tcs = new TaskCompletionSource<int>();
- var timer = new System.Timers.Timer(5000) { AutoReset = false };
- timer.Elapsed += (sender, e) => {
- timer.Dispose();
- int i = Enumerable.Range(1, 100).Sum();
- tcs.SetResult(i);
- };
- timer.Start();
- return tcs.Task;
- }
- var task = delayFunc();
- Console.Write(task.Result);
- Task.Delay (5000).GetAwaiter().OnCompleted (() => Console.WriteLine (42));
- 或者:
- Task.Delay (5000).ContinueWith (ant => Console.WriteLine (42));