|
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
今天做的一个东西,项目里到处都是 BackgroundWorker, 每一处大概都有7, 8行。 今天决定refactor一下,做了个BackgroundWorkerManager warpper。
示意原先的代码
-----------------------------------------------------------------------------
var inputParams = 190;
void Initialise()
{
var backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
backgroundWorker.RunWorkerAsync(inputParams);
}
void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Do Work Logics
//var inputParams = (int)e.Argument; //inputParams can you any type, ie. arrays, lists, string, int
//e.Result = [object];
}
void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Work Complete Logics
//var result = (AnyDataType)e.Result;
backgroundWorker.DoWork -= new DoWorkEventHandler(BackgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
}
-----------------------------------------------------------------------------------
技术上对这个 BackgroundWorkerManager wrapper 有几个要求。
1. Initialise() 里的代码不超过2行。
2. wrapper 里必须要有delegate, 把DoWork, RunWorkerCompleted logic delegate 到caller.
3. 最好要用generics (type safe), rather than pass object data type around.
4. 另外请注意, BackgroundWorker inherits from Component which has IDisposable interface.
会把我做的明后天贴出来。 在此之前,大家不妨讨论讨论,意在抛砖引玉, 发散开去应该会有不少很有趣的讨论点。
尽量有针对性,避免泛泛而谈。 |
|