//dll里面的内容
public class PushStreamContent : HttpContent
{
public PushStreamContent(Action<Stream, HttpContent, TransportContext> onStreamAvailable);
}
有2种调用方式
第1种--使用lambad表达式 return new PushStreamContent((outputStream, content, context) => { WriteToStream(outputStream, content, context, fullName); });
第2种 Action<Stream, HttpContent, TransportContext> aciton = new Action<Stream, HttpContent, TransportContext>(WriteToStream2);
return new PushStreamContent(aciton);
多线程的几种使用方式
1.使用线程池
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTryUpdate), parameter);
2.使用线程并行
System.Threading.Tasks.ParallelOptions option = new System.Threading.Tasks.ParallelOptions();
option.MaxDegreeOfParallelism = 4;
System.Threading.Tasks.Parallel.ForEach(SingleDPStockList, option, (parameter) =>
{
try
{
DoTryUpdate(parameter);
}
catch (Exception ex)
{
Log4.log.Error(ex.Message);
}
});
//以上代码机制会自动阻塞主线程和UI线程,以达到同步的效果
3使用task
Action<object> action = new Action<object>(DoTryUpdate);
for(int m=0;m<SingleDPStockList.Count;m++)
{
Task[] tasks = new Task[4];
for (int n = 0; n < tasks.Length; n++)
{
tasks[n]=Task.Factory.StartNew(action, SingleDPStockList[m]);//新建并开启新线程,自动往线程池中加。
}
Task.WaitAll(tasks);//阻塞主线程或者UI线程(不加这句话,仍然是异步,也就是主线程或者UI线程和线程池中的线程是一起执行的)
}
//主线程或者UI线程代码
4使用invoke或者begininvoke
StockUpdateHandler handler = new StockUpdateHandler(DoTryUpdate); //StockUpdateHandler是事先定义好的委托
//IAsyncResult result = handler.BeginInvoke(parameter, null, null);
//handler.EndInvoke(result); //用BeginInvoke的话,这2句之间的代码,可以不用等到DoTryUpdate执行完,就能执行(异步)
handler.Invoke(parameter);
总结:task和线程池是同样的原理,新建的每一个task都会加到线程池里面(可以设置一个最大数),这些线程池里面的线程是一起执行的(也就是异步),同时和外面的主线程或UI线程是异步的(可以用WaitAll来阻塞外面的主线程或者UI线程,然后达到同步的效果。),而并行库,也就是第2种方法,假设4个一起并行,那么并行的这4个线程是一起执行的,所以才叫并行,也就是异步,并行的线程和外面的主线程或者UI线程是同步的(机制已经阻塞了外面主线程或者UI线程)。invoke(同步)和begininvoke(异步)是针对消息通知的。对于begininvoke和endinvoke中间的代码可以不用等到处理完成,就可以先执行。
多线程更多例子请参考项目comparethread
public class ThreadService
{
public void Excute<T>(T inputParameter, Action<T> action)
{
action.BeginInvoke(inputParameter, null, null);
}
public void Excute(Action action)
{
action.BeginInvoke(null,null);
}
}
public static void Excute(this Control control, Action action, Action callBack = null, object o = null)
{
action.BeginInvoke(ob =>
{
if (callBack != null)
{
if (control.IsHandleCreated)
{
control.BeginInvoke(callBack);
}
}
}, o);