Action執行與Delegate的差異,調用方法
阿新 • • 發佈:2018-07-01
foreach task use ssi msd 聲明 gzip 不用 add
MSDN:可以使用 Action<T> 委托以參數形式傳遞方法,而不用顯式聲明自定義的委托。 封裝的方法必須與此委托定義的方法簽名相對應。 也就是說,封裝的方法必須具有一個通過值傳遞給它的參數,並且不能返回值。 (在 C# 中,該方法必須返回 void。 在 Visual Basic 中,必須通過 Sub…End Sub 結構來定義它。 它也可以是返回已忽略的值的方法。)通常,這種方法用於執行某個操作。
Action是一個泛型的委托,其內部即使用delegate去實現,當普通的delegate定義的參數與Action個數、類型一致時,兩者實現的功能是一樣的。只是Action的方式更加簡潔、規範。如下:
public delegate void DoDelegate(object parm); public DoDelegate DoMethod; public Action<object> doAction4OneParm; public Action<object, object> doAction4TwoParm; private void Form1_Load(object sender, EventArgs e) { DoMethodView Code+= DoTestMetohd; //普通委托(由於委托定義時給定一個參數,故此處匹配一個參數的方法) doAction4OneParm += DoTestMetohd; //Action委托(此處匹配一個參數的方法) doAction4TwoParm += DoTestMetohd; //Action委托(此處匹配兩個參數的方法) } private void DoTestMetohd(object parm) { MessageBox.Show(Convert.ToString(parm)); }private void DoTestMetohd(object parm1, object parm2) { MessageBox.Show(Convert.ToString(parm1 + " " + parm2)); }
另一種寫法
try { if (File.Exists(path)) { byte[] by = File.ReadAllBytes(path); by = by.GzipDecompression(); Dictionary<string, Model> list = JsonHelper.DeserializeObject<Dictionary<string, Model>>(Encoding.UTF8.GetString(by)); Action<object> ac = (p) => { KeyValuePair<string, Model> v = (KeyValuePair<string, Model>)p; if (bool) { //DoSomething } else { //DoSomething } }; List<Task> tasks = new List<Task>(); foreach (KeyValuePair<string, CacheDataModel> v in list) { tasks.Add(Task.Factory.StartNew(ac, v)); } Task.WaitAll(tasks.ToArray()); for (int i = 0; i < tasks.Count; i++) { tasks[i].Dispose(); } tasks = null; } else { } } catch (Exception e) { }
Action執行與Delegate的差異,調用方法