摘要:
效果图用法使用FlowRadioGroup代替RadioGroup代码import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.widget.RadioGroup;/** * 流式布局的RadioGroup */public class FlowRadioGroup extends RadioGroup { public FlowRadioGroup(Context context) { super(context);... 阅读全文
摘要:
小米2S有一个设定会导致,App无法接收到android.provider.Telephony.SMS_RECEIVED广播。解决方案 关闭系统短信优先设置短信-设置-高级设置-系统短信优先来自为知笔记(Wiz) 阅读全文
摘要:
这只是一些代码片段,由于Wiz开发的资料实在不多,而且内容都不够新。 这里的代码主要参考Tools.Timer这个插件,但是由于内部实现的很多变化,Tools.Timer这个插件基本上已经无法使用了。 定时器的注册与删除 使用定时器,是需要注册的。注册一个每60000毫秒(1分钟)触发一次Timer 阅读全文
摘要:
这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类。但是出于完整性,还是将一下怎么使用.NET4的并行扩展,也就是一直在使用Task模型来处理异步问题。有一个特别好处是,当有大量并发的IO操作时会有更好的效果。大量并发的IO操作的含义是类似如下private List> tasks;有一堆... 阅读全文
摘要:
主要的几个概念(详细最好还是看书,配合插图看)任务是会被分配到线程上的,而这些线程都在线程池引擎下管理线程池引擎管理着合适数量的线程池,线程从全局队列获取工作项执行。.NET4 Framework 4改进了全局队列的加入和退出算法,使用了无锁的方式。通常还是建议使用包装后的Task,但是也是可以直接为ThreadPool加入工作项的,参考代码如下ThreadPool.QueueUserWorkItem((state) =>{//...}, param);其中param是一个Object,用于传入参数。而在callback中以state使用。使用ThreadPool.QueueUserWo 阅读全文
摘要:
没有什么好说的,主要是将调试模式下的Parallel Tasks窗体和Parallel Stacks窗体。折腾一下应该比看书效果好。(表示自己没有折腾过)另外值得注意的是,主线程不是一个任务。所以主线程不会出现在任务列表或任务图中。来自为知笔记(Wiz) 阅读全文
摘要:
PLINQ这个话题好多书都写到过,这本也没有什么特别好的地方。几个有用和有趣的点记录一下。顺序的不确定性用PLINQ就一定要记住并行后会导致顺序不确定的问题。解决方案就是AsOrdered或者orderby子句。var keysWith10Letters = from key in Keys.AsParallel().AsOrdered()where (CountLetters(key) >= 10)&& (key.Contains('A'))&& (key.Contains('F'))&& (key.Con 阅读全文
摘要:
本章介绍了一些轻量级的同步原语,其中有很大部分是.NET Framework 4才引入的。System.Threading.Barrier用于一段程序分成多个阶段,每个阶段的开始都需要之前的阶段完成。如果这段程序需要并行化。可以在每段之间采用Barrier。还可以设置在每个阶段之间的动作。task在Barrier中成为参与者(participant),在构造的时候要设定数量,也可以动态的增删。异常和超时的处理可以参考代码。相比于使用使用Task的ContinueWith方法实现多个阶段的串行,Barrier可以减少非常多的Task数量。用完后需要DisposeTask[] _tasks;Bar 阅读全文
摘要:
这一章主要介绍了System.Collections.Concurrent下的几个类。ConcurrentQueue并发队列。完全无锁,使用CAS(compare-and-swap)比较并交换和自旋重试来实现线程安全。//加入队尾public void Enqueue(T item)//尝试删除队头,并将元素通过out返回,返回值表示是否操作成功public bool TryDequeue(out T result)//尝试获取队头,通过out返回元素,返回值为代表是否操作成功public bool TryPeek(out T result)ConcurrentStack并发栈,完全无锁,使用 阅读全文
摘要:
Task的使用var t1 = new Task(() => GenerateAESKeys());var t2 = new Task(() => GenerateMD5Hashes());// Start the taskst1.Start();t2.Start();// Wait for all the tasks to finishTask.WaitAll(t1, t2);等待超时// Wait for all the tasks to finish with a 1 second timeoutif (!Task.WaitAll(new Task[] { t1, t2 }, 阅读全文