or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing
xxxxxxxxxx
tags:
C#
C#-多線程API
請參考Elevan老師的教學影片(第1集)(第2集)(第3集)(第4集)(第5集)(第6集)
以下節錄我認為的重點。
什麼是委託(delegate)?
委託是個類型(Class),需要實例化(Instance)。
委託的目的是讓方法變成變量(實例),如此便能傳遞。
(其實就是C/C++的函數指標)
Lambda表達式的演進
Lambda表達式的精神就是匿名函數
在以下這個例子中,DoNothing_2 這個函數已經被匿名了。
拿掉delegate關鍵字,並加上箭頭=>
中間是箭頭=>,左邊()是參數列表,右邊{}是方法體
Action / Func
.net 3.0 時,微軟統一了委託的寫法,引進Action與Func,取代了Delegate,
避免讓大家寫出各式各樣的委託
也就相當於我們自己寫的
delegate void NoReturnNoPara()
同步方法與異步方法
–>越複雜差越多,資源換時間,但資源不一定夠–>線程絕不是越多越好
例如有一個任務特別複雜,但可以切成多個子任務「獨立進行」,則適合多線程。若不能切,則不適合多線程
線程是.net向OS申請的,OS會如何分配線程?不可控!
為什麼結束也不可控?即使是同一個線程執行同一個任務,執行時間也不可控。
因為CPU時間被切片了!OS會如何分配切片?不可控!
–>應該透過回調(callback),等待狀態,等待信號量來控制順序。
異步方法的控制
對Func使用才有意義,可以得到結果。
當然對Action也能使用,只是就沒有返回值,效果與前面一樣。
.net 1.0 Thread
.net 2.0 Thread Pool
.net 3.0 Task 與 .net 4.5 Task.Run() 這是目前主流寫法
.net 4.0 Task Factory
.net 4.5 Parallel
.net 4.5 await/async
await / async 這兩個是成對的,要用一起用,單獨使用是沒有意義的
這個就是讓你寫的方便點,沒有什麼特殊的功能 –> 用寫同步的方式來寫異步
多線程的其他觀念
建議在Action裡面包一層try-catch,在線程裡,不要出現異常;如果有異常,在線程裡面處理好.
應該在線程內部,自己停止自己。通常的作法是定期檢查一個flag,判斷是否結束線程。
同時有多個線程寫入同一個東西,就會發生覆蓋!
(同一個變數)(同一個集合)(同一個文件)(同一個資料庫)
最好能避免線程衝突,例如利用「數據拆分」的方式,並發寫多個小數據,最後再合成一個大數據。(多個小數據)(多個小集合)(多個小文件)…
另外,資料庫是沒辦法拆分的!