рд╕реА # рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рдирдХреЛрдЯреЗрдХреНрд╕реНрдЯ

рдирд┐рд░рдВрддрд░рддрд╛: рднрд╛рдЧ III ред



Async ( рднрд╛рдЧ I ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рдкреЛрд╕реНрдЯ рдПрдХ рдкрд░рд┐рдЪрдп рдерд╛ред рдЗрд╕рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛ рд╡рд┐рд╖рдп рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕реЗ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛: рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред



рдкрд░реАрдХреНрд╖рдг рд╕реНрдерд▓ рднреЛрдЬрдирдкреНрд░рджрд░реНрд╢рдиреА рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдбрд╛рдпрдЬрд╕реНрдЯреНрд░рд╛ рдХреЗ рднреЛрдЬрди рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЗ рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдп ( рд▓рд┐рдВрдХ ) рдХрд╛ рдПрдХ рджреГрд╢реНрдп рд╣реИред рдЖрдЧреЗ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред



рдЫрд╡рд┐



рдХрд╛рд░реНрдпрдХреНрд░рдо рдЫреЛрдЯрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХрдХреНрд╖рд╛рдПрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореБрдЦреНрдп рд╕рд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВ: рджрд╛рд░реНрд╢рдирд┐рдХ, рджрд╛рд░реНрд╢рдирд┐рдХ рдФрд░ рдХрд╛рдВрдЯрд╛ рдХреА рд╕реНрдерд┐рддрд┐ред



рдмрдлрд╝рд░рдмреНрд▓реЙрдХ рдХреНрд▓рд╛рд╕ рдХреЛ рдПрдХ рдХрд╛рдВрдЯреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ System.Threading.Tasks.Dataflow рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдпрд╣ рд╕реНрдерд╛рди рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╡реЗ рдЪреИрдирд▓ рд╣реИрдВ рдЬреЛ рд▓рд┐рдореНрдмреЛ, рдЧреЛ, рдПрдХреНрд╕рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; рдЙрдирдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рджреЛ рд╕реНрдЯреНрд░реАрдо рдЪреИрдирд▓ (рдХрддрд╛рд░ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдзрд╛рд░рд╛ рдЪреИрдирд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ рдФрд░ рдЪреИрдирд▓ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдЪреИрдирд▓ рдореЗрдВ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рддрдХ рд╕реНрдЯреНрд░реАрдо рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЖрдо рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдФрд░ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрдлрд╝рд░рдмреНрд▓реЙрдХ рдПрдХ рдРрд╕рд╛ рдЪреИрдирд▓ рд╣реИ, рдкреЛрд╕реНрдЯ рдореЗрдердб рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд░рд┐рд╕реАрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рд╕реАрд╡реЗрд╕рд┐рдВрдХ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ: рдПрдХ рд╕реБрд▓рдн рдкреНрд▓рдЧ рдХрд╛ рд╡рд░реНрдгрди рдПрдХ рдЪреИрдирд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рд╡реНрдпрд╕реНрдд рдкреНрд▓рдЧ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рдЪреИрдирд▓ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдПрдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╣реИ, рддреЛ рдПрдХ рдореБрдлреНрдд рдкреНрд▓рдЧ (рдЪреИрдирд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдФрд░ рдПрдХ рд╡реНрдпрд╕реНрдд рджреНрд╡рд╛рд░рд╛, рдпрд╣ рд╣реЛрдЧрд╛ред рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ред



рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рджрд╛рд░реНрд╢рдирд┐рдХ рд╡рд░реНрдЧ рд╕реНрд╡рдпрдВ рджрд╛рд░реНрд╢рдирд┐рдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдХрд╛ рд░рд╛рдЬреНрдп, рдЬреЛ рдХрд┐ рдХрд▓реНрдкрдирд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╛рдирдХ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдЖрджрд┐рдо рд╣реИ - рдПрд▓реАрдк рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рд╣реИ, рджрд╛рд░реНрд╢рдирд┐рдХ рд╕реНрд╡рдпрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдзрд╛рдЧреЗ (RunPhilosopherAsync рд╡рд┐рдзрд┐) рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



using Philosopher = Ellipse; using Fork = BufferBlock<bool>;
      
      





MainWindow рд╡рд┐рдзрд┐ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдореЗрдВ рд╡рд░реНрдЧ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЖрд░рдВрднреАрдХреГрдд рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ async рд╢реВрдиреНрдп рд╣реИ, рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╣рдо рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред



 public MainWindow() { for (int i = 0; i < philosophers.Length; i++) { diningTable.Children.Add(philosophers[i] = CreatePhilosopher()); forks[i] = new Fork(); forks[i].Post(true); } //      for (int i = 0; i < philosophers.Length; i++) { RunPhilosopherAsync( philosophers[i], i < philosophers.Length - 1 ? forks[i] : forks[1], i < philosophers.Length - 1 ? forks[i + 1] : forks[i] ); } }
      
      





RunPhilosopherAsync рдХреЛрдб рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИ: рд╕реЛрдЪреЗрдВ, рдХрд╛рдВрдЯреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдЦрд╛рдПрдВ, рдХрд╛рдВрдЯрд╛ рд╡рд╛рдкрд╕ рдбрд╛рд▓реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪреЗрдВред рдард╣рд░рд╛рд╡ (рдЯрд╛рд╕реНрдХрдПрдХреНрд╕ред рдбреЗрд▓) рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХреЗрдВред



 private async void RunPhilosopherAsync(Philosopher philosopher, Fork fork1, Fork fork2) { // ,  , ,     while (true) { //  () philosopher.Fill = Brushes.Yellow; await TaskEx.Delay(_rand.Next(10) * TIMESCALE); //   () philosopher.Fill = Brushes.Red; await fork1.ReceiveAsync(); await fork2.ReceiveAsync(); //  () philosopher.Fill = Brushes.Green; await TaskEx.Delay(_rand.Next(10) * TIMESCALE); //       fork1.Post(true); fork2.Post(true); } }
      
      





рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЧрддрд┐рд░реЛрдз) рдЬрдм рд░реЗрдЦрд╛ рдХреЗ рдХрд╛рд░рдг рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЛ рд╣реЛрддреА рд╣реИ:



 i < philosophers.Length - 1 ? forks[i] : forks[1]
      
      





рдХрд╛рдВрдЯреЗ [1] рдХреЛ рдХрд╛рдВрдЯреЗ [0] рд╕реЗ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдирд╛рдЗрдЯ-рдкрд┐рдХрд┐рдВрдЧ рд╣реИ, рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдВрдЪ рд╣реЛрдиреЗ рджреЗрдВред



рджреВрд╕рд░реЗ, рдХреЛрдб рдХреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рджреВрд╕рд░реЗ рддрддреНрд╡ рд╕реЗ рдЧреБрдИ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ "x.Wait ()", рдФрд░ "RunPhilosopherAsync (...)" рдХреЗ рд╕рд╛рде "рдирдИ рдЯрд╛рд╕реНрдХ () =>> RunPhilosopherAsync (...)" рдХреЗ рд╕рд╛рде рд╣рд░ рдЬрдЧрд╣ "рдкреНрд░рддреАрдХреНрд╖рд╛ x" рдХреА рдЬрдЧрд╣ рд▓реЗ рд▓реЗрдВред рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ () "рдФрд░ async рдЯреЛрдХрди рдХреЛ рд╣рдЯрд╛рдХрд░, рд╣рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд InvalidOperationException рдорд┐рд▓рддрд╛ рд╣реИред



рдЫрд╡рд┐



рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рднреА рдЬрд╛рджреВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред



.рдиреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЧреБрдЗ-рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛


рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдпрд╣ .Net рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЧреБрдИ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИред



WinForms рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЖрд╣реНрд╡рд╛рди рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ gui рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред WPF рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдирд┐рдпрдВрддреНрд░рдг рдХреА рдбрд┐рд╕реНрдкреИрдЪрд░ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдЗрдирд╡реЛрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ рдЗрд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ред



рдпрд╣ рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд░ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ: рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЬреЛ рдЦреБрдж рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджреЛрд╣рд░рд╛ рд░рд╣реА рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереНрд░реЗрдб рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рд╕реЗ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ gui рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╣ COM рдФрд░ WCF рдореЗрдВ рднреА рдкреЙрдк рдЕрдк рдХрд░рддрд╛ рд╣реИ ... рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдереНрд░реЗрдб рдЗрд╕рдореЗрдВ WinForms рдФрд░ WPF рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ SynchronizationContext рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Send рдФрд░ Post (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ) рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдХреЗ SynchronizationContext рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ SynchronizationContext.Current (рдкреНрд░рддрд┐ рдереНрд░реЗрдб рд╕рд┐рдВрдЧрд▓рдЯрди) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рд╕реНрдЯреНрд░реАрдо рд╕рдВрдЧрдд рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕реНрдЯреНрд░реАрдо рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рддреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЗрд╡реЗрдВрдЯ рдХреНрдпреВ рддрдХ рдкрд╣реБрдБрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ SynchronizationContext рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ Send рдФрд░ Post рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдереНрд░реЗрдбрдкреВрд▓ рд╕реЗ рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред



рдЕрдм рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рдЕрдкрдирд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ:



 class MyContext : SynchronizationContext { public override void Post(SendOrPostCallback d, object state) { Console.WriteLine("MyContext.Post"); base.Post(d, state); } public override void Send(SendOrPostCallback d, object state) { Console.WriteLine("MyContext.Send"); base.Send(d, state); } } class Program { static async Task SavePage(string file, string a) { using (var stream = File.AppendText(file)) { var html = await new WebClient().DownloadStringTaskAsync(a); await stream.WriteAsync(html); } } static void Main(string[] args) { SynchronizationContext.SetSynchronizationContext(new MyContext()); var task = SavePage("habrahabr", "http://habrahabr.ru"); task.Wait(); } }
      
      





рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, "MyContext.Post" рдХреЛ рдХрдИ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SynchronizationContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдирд┐рд╖реНрдХрд░реНрд╖


рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рдо рдкрд░ SynchronizationContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддрдереНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рддрддреНрд╡ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред



рд╡реИрд╕реЗ, SynchronizationContext рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрдм рд╕рд┐рдВрдЧрд▓рдЯрди рдПрдХ рдкреВрд░реНрдг рдмреБрд░рд╛рдИ рдирд╣реАрдВ рд╣реИред



рдореБрдЭреЗ рдпрд╣ рдиреЛрдЯ 1 рдирд╡рдВрдмрд░ рдХреЗ ikvm.net рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рд▓реЗрдЦ "рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ" ( рднрд╛рдЧ I , рднрд╛рдЧ II рдФрд░ рднрд╛рдЧ III ) рдиреЗ рдореБрдЭреЗ рд╡рд┐рд╖рдп рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХреАред



All Articles