рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХреЛрдб рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ред рд╣рдордиреЗ рддреБрд░рдВрдд рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рддреНрд╡рд░рд┐рдд рджрд┐рдорд╛рдЧ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХ рд╕реНрддреВрдк рдореЗрдВ (рд╣рд┐рд╕реНрдЯреЗрд░рд┐рдХрд▓ рд╣рдБрд╕реА рдХреЗ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХреЗ рдмрд╛рдж) рдЪрд▓рд╛рддреЗ рд╣реИрдВред рддреЛ, рд╣рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:
Action<Action> action = (Action action) => { action(); };
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╣реИрдмреНрд░реИрдЯ рдХреЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ, рдХреБрдЫ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдЖрдЗрдП рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдкреЛрд╕реНрдЯ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ):
- рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ?
- рдХреНрдпрд╛ рд╡рд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛?
- рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ?
- рдРрд╕рд╛ рдХреЛрдб рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
- рдЗрд╕ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? (рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ?)
- рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рджреЗрдВред
- рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ?
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рд╣реИ? рдлрд┐рд░ рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреИрдЯ рдХреЗ рдиреАрдЪреЗ рдЧреЛрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ C # рдХреЗ рддрд╣рдд .Net рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИред рдмреЗрд╢рдХ, рд╣рдордиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕реЗ рдордЬрд╝рд╛рдХрд┐рдпрд╛ рдкрд▓рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
private Action<Action> doWork = work => { work(); };
рд░реВрд╕реА рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЕрдиреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣ рдХреИрд╕реЗ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛, рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ, рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдб рдерд╛ (рд╕рднреА рдирд╛рдо рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИрдВ, рдФрд░ рд╕рдВрдпреЛрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрдВ):
public class MyWorker { private void DoWorkInternal() { Thread.Sleep(1000);
рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ:
[TestMethod] public void TestDoWork() { MyWorker worker = new MyWorker(); Assert.IsFalse(worker.IsWorkDone); worker.DoWork(); Assert.IsTrue(worker.IsWorkDone); }
рд╕рдордп рдХреЗ рд╕рд╛рде, рдпреБрджреНрдз рдХреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐
DoWorkInternal
рд╡рд┐рдзрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЖрд╡реЗрджрди рдХреЗ рдЖрдЧреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:
public void DoWork() { Task.Factory.StartNew(DoWorkInternal); }
рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдордиреЗ рджрд░реНрдЬрдиреЛрдВ рдкрд░реАрдХреНрд╖рдг рдлреЗрдВрдХреЗ, рдЬреЛ рдпрд╣ рдорд╛рдирддреЗ рд░рд╣реЗ рдХрд┐ рдХрд╛рдо рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╕рдордЭрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ (рдХрд╛рд░реНрдп рдХреЗ рддрдереНрдп рдФрд░ рдЙрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рдереА рдХрд┐ рдПрдХ рдорд╣реАрдиреЗ рдореЗрдВ рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╢рди рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрдерд┐рддрд┐ рдХреЗ рдереЛрдбрд╝рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХред рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд░рдгрдиреАрддрд┐ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ:
public class MyWorker { private Action<Action> doWork = work => { work(); }; private void DoWorkInternal() { Thread.Sleep(1000);
рдпрд╛рдиреА рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рд░рдгрдиреАрддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
(Action work) => { work(); }
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд░рдгрдиреАрддрд┐:
(Action work) => { Task.Factory.StartNew(work); }
рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдРрд╕реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рд╕рд┐рдВрдХреНрд░реЛрдирд╕) рдХреА рд░рдгрдиреАрддрд┐ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рд╕рдХреЗрдВ:
public void SetDoWorkStrategy(Action<Action> doWork) { this.doWork = doWork; }
рд╣реЛ рдЧрдпрд╛ред рд╕рдмреВрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:
[TestMethod] public void TestDoWork() { MyWorker worker = new MyWorker(); Assert.IsFalse(worker.IsWorkDone); worker.DoWork(); Assert.IsTrue(worker.IsWorkDone); MyWorker worker2 = new MyWorker(); Action<Action> asyncWorkStrategy = (Action work) => { Task.Factory.StartNew(work); }; worker2.SetDoWorkStrategy(asyncWorkStrategy); Assert.IsFalse(worker2.IsWorkDone); worker2.DoWork(); Assert.IsFalse(worker2.IsWorkDone);
рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХреНрд░реЙрд╕-рдереНрд░реЗрдб рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдирд┐рдпрдВрддреНрд░рдг рддрдХ рдкрд╣реБрдВрдЪ, рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЖрджрд┐ред рдЕрдиреНрдпрдерд╛, рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░реВрдБрдЧрд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛ рд╕рдХрддрд╛ рд╣реИред
рджрд┐рдП рдЧрдП рдХреЛрдбрдмреЛрд░ рдХрд╛ рдкреАрдПрд╕ рдЪрд░реНрдЪрд╛ .Net рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╖рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ