MonoTouch 中的線程
在 MonoTouch 中, 可以使用標(biāo)準(zhǔn)的 .Net 線程 API , 既可以直接使用線程(System.Threading.Thread、System.Threading.ThreadPool), 也可以簡(jiǎn)介使用異步委托模式以及 BeginXXX 、 EndXXX 方法。
最好使用 Mono 的線程池, 這樣,系統(tǒng)的開銷增加的非常緩慢, 充分利用多核來平衡系統(tǒng)的負(fù)載以及程序的需求。 可以通過調(diào)用 System.Threading.ThreadPool 的方法或者使用默認(rèn)的 System.Threading.Tasks.TaskScheduler (Parallel Framework 的一部分) 來使用線程池。
通常, 當(dāng)開發(fā)者需要?jiǎng)?chuàng)建即時(shí)響應(yīng)界面并且不希望阻塞主界面的程序時(shí), 需要用到線程。
開發(fā)即時(shí)響應(yīng)的應(yīng)用
對(duì)界面元素的操作必須限制在運(yùn)行主界面循環(huán)的線程, 如果需要線程中對(duì)界面做修改, 則必須使用 NSObject.InvokeOnMainThread 把代碼添加到隊(duì)列, 例如:
MyThreadedRoutine() {
var result = DoComputation();
// 計(jì)算完成之后, 需要更新界面, 需要保證操作界面的代碼一定是在主界面線程執(zhí)行
InvokeOnMainThread(delegate {
label.Text = "The result is: " + result;
});
}
上面的委托中的代碼會(huì)在主界面線程的上下文中執(zhí)行, 沒有任何競(jìng)爭(zhēng)條件, 不會(huì)導(dǎo)致程序崩潰。
線程與垃圾回收
Objective-C 運(yùn)行時(shí)會(huì)在執(zhí)行的過程中創(chuàng)建和銷毀對(duì)象, 如果對(duì)象被標(biāo)記為 “auto-release” , Objective-C 運(yùn)行時(shí)將會(huì)把這些對(duì)象放到線程當(dāng)前的 NSAutoReleasePool 進(jìn)行銷毀。 MonoTouch 為主界面線程以及每個(gè)由 ThreadPool 創(chuàng)建的線程分配一個(gè) NSAutoReleasePool, 當(dāng)然也包括用默認(rèn) TaskScheduler 創(chuàng)建的 Task 。
如果需要?jiǎng)?chuàng)建自己的線程, 則必須也提供一個(gè) NSAutoReleasePool 來防止內(nèi)存泄漏, 如果要這樣做的話, 用下面的代碼包含你的代碼即可:
void MyThreadStart(object arg) {
using (var ns = new NSAutoReleasePool()) {
// Your code goes here.
}
}
張志敏所有文章遵循創(chuàng)作共用版權(quán)協(xié)議,要求署名、非商業(yè) 、保持一致。在滿足創(chuàng)作共用版權(quán)協(xié)議的基礎(chǔ)上可以轉(zhuǎn)載,但請(qǐng)以超鏈接形式注明出處。
本博客已經(jīng)遷移到 GitHub , 圍觀地址: https://beginor.github.io/
浙公網(wǎng)安備 33010602011771號(hào)