1.任务StartNew后就开始执行,使用Wait()来确保任务结束后继续

static void Main(string[] args)
{
try
{
int numberOfUsers = 100;
var users = new string[20];
for (int i = 0; i < 20; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
} Task t = Task.Factory.StartNew(() => WriteLog(users[5]));
Thread.Sleep(5000);
Console.WriteLine("Is first one start?");
Task t1 = Task.Factory.StartNew(() => WriteLog(users[6]));
Thread.Sleep(5000);
Console.WriteLine("Are they start?");
Thread.Sleep(5000);
t1.Wait();
Console.WriteLine("Will End soon!");
t.Wait();
Thread.Sleep(500000000); }
catch (Exception ex)
{
Console.WriteLine(string.Format("Time {0}:{1}",DateTime.Now, ex.Message));
Thread.Sleep(500000000);
}
} private static void WriteLog(string userName)
{
Console.WriteLine(string.Format("Begin Time {0}:ProcessId {2} ThreadId {3} {1}", DateTime.Now, userName, System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId));
Thread.Sleep(5000);
if (userName == "LoadTest2")
{
Thread.Sleep(5000);
throw new Exception("Lazy!");
}
Console.WriteLine(string.Format("End Time {0}:ProcessId {2} ThreadId {3} {1}", DateTime.Now, userName, System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId));
}

执行效果:





使用ThreadPool也是同样效果:

    foreach (string user in users)
{
ThreadPool.QueueUserWorkItem(arg =>
{
WriteLog(user);
});
}

2.10个任务一起执行,须注意WriteLog的参数不能直接使用i,因为在实际开始工作的时候i值已经变成了10

Task[] ts = new Task[10];
for(int i=0;i < numberOfUsers ; i++ )
{
ts[i] = Task.Factory.StartNew((object obj) => {
int j = (int)obj;
WriteLog(users[j]); }, i);
}
Task.WaitAll(ts);
Console.WriteLine("Will End soon!");
Thread.Sleep(500000000);







3.总共20个人,后10个人接着前面10个人后干活,使用ContinueWith , 其中传的prevTask可以得到前面任务的状态

static void Main(string[] args)
{
try
{
int numberOfUsers = 10;
var users = new string[20];
for (int i = 0; i < 20; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
} Task[] ts = new Task[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
ts[i] = Task.Factory.StartNew((object obj) =>
{
int j = (int)obj;
WriteLog(users[j]);
}, i).ContinueWith((prevTask) =>
{
string exp = string.Empty;
if (prevTask.Exception!=null ) exp = "Exception:" + prevTask.Exception.Message;
Console.WriteLine(string.Format("ID:{0} Status:{1} IsCanceled:{2} IsCompleted:{3} {4}", prevTask.Id, prevTask.Status, prevTask.IsCanceled, prevTask.IsCompleted, exp));
WriteLog(users[9 + prevTask.Id]);
}); } Task.WaitAll(ts);
Console.WriteLine("Will End soon!");
Thread.Sleep(500000000); }
catch (Exception ex)
{
Console.WriteLine(string.Format("Time {0}:{1}",DateTime.Now, ex.Message));
Thread.Sleep(500000000);
}
}





4.获取UI上的值来控制是否cancel一个任务下面的所有子任务,使用CancellationTokenSource

static void Main(string[] args)
{
try
{
int numberOfUsers = 10;
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
}
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
ConcurrentBag<Task> ts = new ConcurrentBag<Task>();
Console.WriteLine("Press any key to begin tasks...");
Console.WriteLine("To terminate the example, press 'c' to cancel and exit...");
Console.ReadKey();
Console.WriteLine(); //Task t = Task.Factory.StartNew(() => WriteLog(users[0], token), token);
//Console.WriteLine("Task {0} executing", t.Id);
//ts.Add(t); Task t = Task.Factory.StartNew(() =>
{
Task tc;
for (int i = 0; i < numberOfUsers; i++)
{
tc = Task.Factory.StartNew((object obj) =>
{
int j = (int)obj;
WriteLog(users[j], token);
}, i, token);
ts.Add(tc);
}
},token);
ts.Add(t); if (Console.ReadKey().KeyChar == 'c')
{
tokenSource.Cancel();
Console.WriteLine("\nTask cancellation requested.");
}
try
{
Task.WaitAll(ts.ToArray());
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
{
if (v is TaskCanceledException)
Console.WriteLine(" TaskCanceledException: Task {0}",
((TaskCanceledException)v).Task.Id);
else
Console.WriteLine(" Exception: {0}", v.GetType().Name);
} }
Console.WriteLine("Will End soon!");
Thread.Sleep(500000000); }
catch (Exception ex)
{
Console.WriteLine(string.Format("Time {0}:{1}",DateTime.Now, ex.Message));
Thread.Sleep(500000000);
}
} private static void WriteLog(string userName, CancellationToken ct)
{
Console.WriteLine(string.Format("Begin Time {0}:ProcessId {2} ThreadId {3} {1}", DateTime.Now, userName, System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId));
if (userName != "LoadTest1" && userName != "LoadTest2" && userName != "LoadTest3")
{
Thread.Sleep(5000);
}
if (ct.IsCancellationRequested)
{
Console.WriteLine(string.Format("Cancel :{0} ThreadId {1}", userName, Thread.CurrentThread.ManagedThreadId));
ct.ThrowIfCancellationRequested();
}
Console.WriteLine(string.Format("End Time {0}:ProcessId {2} ThreadId {3} {1}", DateTime.Now, userName, System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId));
}





5.总共10个任务,每次最多3个任务,每当这3个任务中任何一个完成,就会从后续任务中拿出任务来做

static void Main(string[] args)
{
try
{
int numberOfUsers = 10;
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
} Action[] aArr = new Action[numberOfUsers];
int j = 0 ;
for (int i = 0; i < numberOfUsers; i++){
aArr[i] = new Action(() => WriteLog(users[j++]));
} System.Threading.Tasks.ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 3; try
{
System.Threading.Tasks.Parallel.Invoke(po, aArr);
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
{
if (v is TaskCanceledException)
Console.WriteLine(" TaskCanceledException: Task {0}",
((TaskCanceledException)v).Task.Id);
else
Console.WriteLine(" Exception: {0}", v.Message);
} }
Console.WriteLine("Will End soon!");
Thread.Sleep(500000000); }
catch (Exception ex)
{
Console.WriteLine(string.Format("Time {0}:{1}",DateTime.Now, ex.Message));
Thread.Sleep(500000000);
}
}

 



6.总共10个任务,每次最多3个任务,而且每次必须3个一起开始

static void Main(string[] args)
{
try
{
int numberOfUsers = 10;
int maxConcurrent = 3;
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
} int itemProcessed = 0;
int loopCnt = 0;
do
{
List<Task> taskList = new List<Task>();
for (int i = 0; i < maxConcurrent; i++)
{
taskList.Add(Task.Factory.StartNew((object obj) =>
{
int j = (int)obj;
try
{
if (loopCnt * maxConcurrent + j < numberOfUsers)
{
WriteLog(users[loopCnt * maxConcurrent + j]);
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format("{0} encounter error :{1}", users[loopCnt * maxConcurrent + j],ex.Message ));
}
}
,i));
Interlocked.Increment(ref itemProcessed);
}
Task.WaitAll(taskList.ToArray());
loopCnt++;
} while (itemProcessed < numberOfUsers); Console.WriteLine("Will End soon!");
Thread.Sleep(500000000); }
catch (Exception ex)
{
Console.WriteLine(string.Format("Time {0}:{1}",DateTime.Now, ex.Message));
Thread.Sleep(500000000);
}
}

7.每次最多3个user一起干活

!wrong

static void Main(string[] args)
{ ThreadPool.SetMaxThreads(1, 100); int numberOfUsers = 10;
int maxWorkUsers = 3;
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
} var options = new ParallelOptions();
options.MaxDegreeOfParallelism = maxWorkUsers;
Parallel.ForEach(users, options,
(user) =>
{
WriteLog(user);
});
Thread.Sleep(500000000);
}

correct

static void Main(string[] args)
{
try
{
int numberOfUsers = 10;
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
} Action[] aArr = new Action[numberOfUsers];
int j = 0 ;
for (int i = 0; i < numberOfUsers; i++){
aArr[i] = new Action(() => WriteLog(users[j++]));
} System.Threading.Tasks.ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 3; try
{
System.Threading.Tasks.Parallel.Invoke(po, aArr);
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
{
if (v is TaskCanceledException)
Console.WriteLine(" TaskCanceledException: Task {0}",
((TaskCanceledException)v).Task.Id);
else
Console.WriteLine(" Exception: {0}", v.Message);
} }
Console.WriteLine("Will End soon!");
Thread.Sleep(500000000); }
catch (Exception ex)
{
Console.WriteLine(string.Format("Time {0}:{1}",DateTime.Now, ex.Message));
Thread.Sleep(500000000);
}
} private static void WriteLog(string userName)
{
Console.WriteLine(string.Format("Begin Time {0}:ProcessId {2} ThreadId {3} {1}", DateTime.Now, userName, System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId));
Thread.Sleep(5000);
if (userName == "LoadTest2")
{
Thread.Sleep(5000);
throw new Exception("Lazy!");
}
Console.WriteLine(string.Format("End Time {0}:ProcessId {2} ThreadId {3} {1}", DateTime.Now, userName, System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId));
}

8.多線程改變某值

private static List<string> testList = new List<string>();
private static void AddList(string name)
{
testList.Add(name);
} static void test2()
{ int threadcount = 10;
List<Thread> threads = new List<Thread>();
for (int i = 0; i < threadcount; i++)
{
Thread t = new Thread(delegate(object parameter)
{
EmpServiceDataContext db = new EmpServiceDataContext();
int _i = (int)parameter;
int index = 0;
for( int k = 0 ; k < 20000 ; k++)
{
if (index % threadcount == _i)
{
try
{
AddList("Thread" + k);
}
catch (Exception ex)
{
}
}
index++;
}
});
t.Name = string.Format("SendEmailThread_{0}", i);
threads.Add(t);
t.Start(i);
}
foreach (Thread t in threads)
{
t.Join();
}
} Task t = Task.Factory.StartNew(() => test2());
t.Wait();

9.volatile  和 Interlocked

http://baike.baidu.com/view/608706.htm?fr=aladdin

1). 并行设备的硬件寄存器(如:状态寄存器)

 

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

 

3). 多线程应用中被几个任务共享的变量

Interlocked.Decrement(ref JOB_COUNT);

10. ThreadStartStop

如何:创建和终止线程(C# 编程指南)

http://msdn.microsoft.com/zh-cn/library/7a2f3ay4(VS.80).aspx

public class Worker
{
// This method will be called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
} public class WorkerThreadExample
{
static void Main()
{
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork); // Start the worker thread.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread..."); // Loop until worker thread activates.
while (!workerThread.IsAlive); // Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1); // Request that the worker thread stop itself:
workerObject.RequestStop(); // Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}

Task , Thread 学习的更多相关文章

  1. Task类学习教程—组合任务ContinueWith

    Task类学习教程-组合任务.ContinueWith 一.简介 通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务.ContinueWith是Task根据其自身状况,决定后续应该作何操作 ...

  2. Reduce Task的学习笔记

    MapReduce五大过程已经分析过半了.上次分析完Map的过程,着实花费了我的非常多时间.只是收获非常大,值得了额,这次用相同的方法分析完了Reduce的过程,也算是彻底摸透了MapReduce思想 ...

  3. InnoDB master thread学习

    很久很久没有写博客了,工作比较忙,也没什么时间学习了,恰逢国庆放假,安心的学习一下,其实只是把之前学习过的知识再温习了一下而已.InnoDB 有众多的线程,其中非常核心的就是master thread ...

  4. thread学习笔记--BackgroundWorker 类

    背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...

  5. Thread学习

    1.定义 2.作用 3.和进程的比较 4.多线程(multithreading)的优点和缺陷 5.调度(scheduling) 6.线程相关概念 定义 线程就是最小的可编程指令序列,是进程的子集.一个 ...

  6. c++11: <thread>学习

    <thread>头文件中包含thread类与this_thread命名空间,下面逐一介绍. thread类 1. 构造函数 (1)默认构造函数 thread() noexcept; 默认构 ...

  7. Boost Thread学习笔记五

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...

  8. Boost Thread学习笔记四

    barrierbarrier类的接口定义如下:  1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 pub ...

  9. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

随机推荐

  1. 【LOJ】#3097. 「SNOI2019」通信

    LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成 ...

  2. SQL语句中的HAVING关键字

    sql中的having语句是在使用group by的时候使用的. 通常where语句是在group by之前做数据筛选的,而having语句是对group by之后的结果进行筛选的. 例如: 从商品销 ...

  3. work note

    eclipse git 察看历史 左边是提交的 import { NgModule } from '@angular/core'; import { IonicPageModule } from 'i ...

  4. Unable to find optional library: org.apache.http.legacy 错误

    在目录adt-bundle-windows-x86_64-20140702\sdk\platforms\android-20或者 C:\Users\Administrator\AppData\Loca ...

  5. 社工工具包 SEToolkit

    社会工程学(Social Engineering)简称社工,其通过分析攻击对象的心理弱点,利用人性的本能反应,以及任何好奇心,贪婪等心理特征进行的,使用诸如假冒,欺骗,引诱等多种手段来达成攻击目标的一 ...

  6. HTML 5浏览器端数据库

    HTML 5浏览器端数据库为什么要使用浏览器端数据库:随着浏览器处理能力的增强,越来越多的双喜鸟网站开始考虑在客户端存储大量的数据,这可以减少用户从服务器获取数据的等待时间. 1.本地存储-本地存储可 ...

  7. Javascript绑定事件的两种方式的区别

    命名函数 <input type="button" onclick="check()" id="btn"/> <scrip ...

  8. C++ STL 之 set 和 pair

    set/multiset 的特性是所有元素会根据元素的值自动进行排序.set 是以 RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好.set 容器中不允许重复元 素,multis ...

  9. 织梦后台系统设置在PHP5.4环境中不能保存中文参数的解决方法

    在没用PHP5.4的环境做Dede后台的时候,织梦58一直没有遇到这个问题,昨天上传一个新的模版到空间去测试发现后台的系统基本参数设置中所有的中文内容都无法保存,关于这个问题,其实以前也听说过,知识一 ...

  10. zabbix上添加交换机监控记事

    ​ zabbix上添加交换机监控记事 ​ 第一次使用zabbix来添加监控华为s5720交换机,根本找不到头绪,像个无头的苍蝇一样的百度来处理,结果都没有任何效果,给自己增加了很多痛苦和心烦,增加不少 ...