采用多线程解决多核处理、资源共享和耗时任务,同时也会出现内存损耗问题,因此多线程的选择处理需要慎重。线程根据操作的不同场景分为不同的状态,分为未启动、启动、休眠和挂起等状态。线程分为前台线程和后台线程,两者的区别是后台线程中不包含可执行环境,前台线程结束,后台线程随之结束。
托管线程和非托管线程最大的区别在于是否在公共运行库中有上下文,是否能够进行监控和内存回收。非托管的线程需要手动进行内存回收,托管线程则不需要。
线程的数据存储通过线程本地存储(TLS),本地存储的方式包括线程静态字段和数据槽。两者对于线程而言都是单独的备份,也就是说每个线程都存在自己的备份,相互之间不可以修改,处分进行共享对象的共享。
异步任务模型,
同步模型的编程模型包括输出、函数名称、取消、异常和进度等模块,每个模块都有其特殊性。同步编程模型分为计算型同步和读写型同步。前者可以通过Task的任务模型进行启动,同时可以传入CancellationToken监控任务进程。通过任务的进程代理分为两种Action<T>和Func<TResult>,前者返回Task对象,后者返回Task<Tresult>.对于没有返回值的对象很好理解,对于有返回值的对象,需要初始化TaskCompletionObject<TResult>对象,具体实例如下:
{
var tcs = new TaskCompletionSource<int>();
stream.BeginRead(buffer, offset, count, ar =>
{
try { tcs.SetResult(stream.EndRead(ar)); }
catch (Exception exc) { tcs.SetException(exc); }
}, state);
return tcs.Task;
}
{
if (input == null) throw new ArgumentNullException("input");
return MethodAsyncInternal(input);
}
private async Task<int> MethodAsyncInternal(string input)
{
// code that uses await goes here
return value;
}
public static Task<int> ReadTask(this Stream stream, byte[] buffer, int offset, int count, object state)
手动实现的第二条途径,将关键的逻辑代码进行提炼,形成混合模式,混合其实例代码如下:
public Task<int> MethodAsync(string input)
通过微软MVC和JAVA编程语言的学习,得出如下的结论:1)任何事物没有绝对的现金与成功,
随着时间和技术的进展,一切都可能变为过去式.java引以为傲的Spring+Structs,Net随之有了MVC和EntityFramework,
2)java的缺陷在于没有统一的规划,如果采用此种路线需要技术人员具备很好的攻坚能力 3)对于技术型公司,这就是一个很好的吸引力.