
рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ "рдЯреАрдкреАрдПрд▓" (рдЯрд╛рд╕реНрдХ рдкреИрд░реЗрд▓рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рдФрд░ "рдбреАрдПрд▓рдЖрд░" (рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реИрдВрдЧреНрд╡реЗрдЬ рд░рдирдЯрд╛рдЗрдо) рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░, рдЕрдзрд┐рдорд╛рдирддрдГ, рдХрд╛рдлреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореЗрд░реЗ
рдПрдХ рдЕрдиреБрд╡рд╛рдж рдиреЗ рддрдерд╛рдХрдерд┐рдд "рдЦреЗрд▓ рдЪрдХреНрд░" рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЬрд┐рд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреАрдкреАрдПрд▓ + рдбреАрдПрд▓рдЖрд░ рдмрдВрдбрд▓ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЙрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рд╣рд▓реНрдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЗрдВрдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдпрд╛, рдЬреЛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдЦреЗрд▓ рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рдкреЗрдВрдЪ рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ C # рдореЗрдВ рдЗрдВрдЬрди рдХреЛрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЪреБрдирд╛рд╡ рднреА рдирд╣реАрдВ рд╣реБрдЖред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд░реВрдмреА рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪреБрдирд╛ рд╣реИред рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкреЛрд╖рдг рдХрд┐рдпрд╛, рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдиреЗ рдЕрд╡рдХрд╛рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд░рд╣рд╛ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереНрд░реЗрдб рдкрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреА:
- рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдп рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз
- рдХрд╛рд░реНрдп рд╕реНрдерд┐рддрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ
- рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдЖрдЙрдЯрдкреБрдЯ (Stdout рдФрд░ Stderr)
- рдкреНрд░рд╕рд╛рд░рдг рдШрдЯрдирд╛ рджреНрд╡рд╛рд░рд╛ рдХрдВрд╕реЛрд▓ рдХреЛ рдкрд╛рда рдЖрдЙрдЯрдкреБрдЯ рдХреА рд╕реВрдЪрдирд╛
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рдЗрд╕ рддрд░рд╣

рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд░реВрдЯ рдиреЛрдб - "
IRE.Instance " - рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рдордиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдмрд╣реБрдд рд╕реЗрд╡рд╛ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
RunScriptWithScheduler рдФрд░
RunScriptAsync рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдПрдХ
рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпреЗ рдХрд╛рд░реНрдп рдЕрдиреБрд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ, рдЬрд┐рдирдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред "RunScriptWithScheduler" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GUI рдереНрд░реЗрдб рдкрд░ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред "
WriteMessage " рдФрд░ "
WriteError "
рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣рд░ рдЬрдЧрд╣ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреА (рд▓рд┐рдкрд┐рдпреЛрдВ рд╕реЗ) рдФрд░ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░, рд╕реЗрд╡рд╛ рд▓реЙрдЧ рдореЗрдВ рдкрд╛рда рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреНрдпрд╛ рд╣реЛрдЧреА? рдХреБрдВрдЬреА рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп GUID рд╣реИ рдЬреЛ рд░рдирд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдЧреАред рдЗрд╕ GUID рдХреЛ рдЙрд╕ рдкрд╛рд░реНрдЯреА рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реА рдПрдореНрдмреЗрдбреЗрдб рд╣реИред рд░реЗрдХреЙрд░реНрдб рд╡реИрд▓реНрдпреВ рдХреЛ рдХрдо рд╕реЗ рдХрдо
рдХреИрдВрд╕рд┐рд▓реЗрд╢рдирдЯреНрдпреВрдХреЗрди рд╕реЛрд░реНрд╕ рдФрд░
рдЯрд╛рд╕реНрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде
рдЯрд╛рд╕реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЖрдкрдХреЛ рдЙрд╕
рдХрд╛рд░реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рд░рд╛рдЙрдВрдб рдСрдл рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реА рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдХрдВрдЯреАрдиреНрдпреВрдПрд╢рди рдХреЛ рдЯрд╛рдВрдЧрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рдореИрдВрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣рд╛рдВ рдЯреАрдкреАрдПрд▓ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред
IRE рд╕реЗрд╡рд╛
рд╢рд╛рдпрдж рдореИрдВ рдЗрдВрдЬрди рдХреЗ рдХреЛрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ред рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
MSDN рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред JAVA рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдПрдХ рдХрдбрд╝реА рднреА рд╣реИред рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдЗрд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб "рдбрдмрд▓-рдЪреЗрдХреНрдб рд▓реЙрдХрд┐рдВрдЧ" рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЖрдзрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
рд╕рд┐рдВрдЧрд▓рдЯрди рдиреЗ рдХреЛрдб рдЯрд┐рдкреНрдкрдгреА рдХреАusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using IronRuby; using Microsoft.Scripting; using Microsoft.Scripting.Hosting; using System.IO; using System.Threading.Tasks; using System.Diagnostics; using Microsoft.Scripting.Runtime; namespace IREngine { public sealed class IRE { #region Singleton private static volatile IRE _instance; private static readonly object SyncRoot = new Object(); private IRE() { // // IRE.Instance // , - ( , ) // var instance = IRE.Instance; } public static IRE Instance { get { if (_instance == null) { lock (SyncRoot) { if (_instance == null) _instance = new IRE(); } } return _instance; } } #endregion #region Consts // #endregion #region Fields // #endregion #region Properties // #endregion #region Private Methods // #endregion #region Public Methods // #endregion } }
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рджреВрдВрдЧрд╛ред рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрдЬрд╛рдп, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХрд▓ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреИрдЯрд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдХреЙрд▓ рдХрд╛ рдХреНрд╖рдг рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЧреИрд░-рд╕реНрдЯреИрдЯрд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдХреЙрд▓ рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдкрд╣реБрдВрдЪ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдЧрд░ рдЖрдкрдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреБрдЫ рднреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд "рдЕрд╢рдХреНрдд" рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░реА рдЬрд╛рдБрдЪ рд╣реИред рджреЛ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рдкрд╣рд▓реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкрд░ "рд▓реЙрдХ" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ "рдЕрд╢рдХреНрдд" рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗред
TPL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ
рдЕрдм TPL рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реЗрдВред рдЖрдк
CodeProject рдкрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдЬреЛ рд╣рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░реНрд╕ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рд╕реЗрд╡рд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд▓реЙрдЧрд┐рдВрдЧ рд╣реЛрдЧрд╛ред рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
- рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдБрдЪ
- рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рдПрдХреНрд╢рди рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
- рддреНрд░реБрдЯрд┐ рдмрдлрд╝рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛ рдЬрд╛рдБрдЪ
- рддреНрд░реБрдЯрд┐ рдмрдлрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рдХрд╛рд░реНрд░рд╡рд╛рдИ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдЬреЛ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдмрдирд╛рдПрдЧреА
рдЖрдЗрдП рд╕рд┐рдВрдЧрд▓реНрд╕рдЯрди рдХреЗ рдирд┐рдЬреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░реЗрдВ
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд░рд┐рдпрд╛ private IRE() { // Ruby _outStringBuilder = new StringBuilder(); _errStringBuilder = new StringBuilder(); _outWatchAction = () => { int i = 0; while (IsConsoleOutputWatchingEnabled) { string msg = string.Format("***\t_outWatchTask >> tick ({0})\t***", i++); Debug.WriteLine(msg); WriteMessage(msg); Task.Factory.CancellationToken.ThrowIfCancellationRequested(); int currentLength = OutputBuilder.Length; if (OutputUpdated != null && currentLength != _lastOutSize) { OutputUpdated.Invoke(_outWatchTask, new StringEventArgs(OutputBuilder. ToString(_lastOutSize, currentLength - _lastOutSize))); _lastOutSize = currentLength; } Thread.Sleep(TIME_BETWEEN_CONSOLE_OUTPUT_UPDATES); } }; _outWatchExcHandler = (t) => { if (t.Exception == null) return; Instance.WriteError( string.Format( "!!!\tException raised in Output Watch Task\t!!!\n{0}", t.Exception.InnerException.Message)); }; _errWatchAction = () => { int i = 0; while (IsConsoleErrorWatchingEnabled) { string msg = string.Format("***\t_errWatchTask >> tick ({0})\t***", i++); Debug.WriteLine(msg); WriteError(msg); Task.Factory.CancellationToken.ThrowIfCancellationRequested(); int currentLength = ErrorBuilder.Length; if (ErrorUpdated != null && currentLength != _lastErrSize) { ErrorUpdated.Invoke(_errWatchTask, new StringEventArgs(ErrorBuilder. ToString(_lastErrSize, currentLength - _lastErrSize))); _lastErrSize = currentLength; } Thread.Sleep(TIME_BETWEEN_CONSOLE_OUTPUT_UPDATES); } }; _errWatchExcHandler = (t) => { if (t.Exception == null) return; Instance.WriteError( string.Format( "!!!\tException raised in Error Watch Task\t!!!{0}", t.Exception.InnerException.Message)); }; }
рдиреАрдЪреЗ рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдПрдВ рд╣реИрдВред
рдлрд╝реАрд▓реНрдбреНрд╕, рдЧреБрдг, рд╕реНрдерд┐рд░рд╛рдВрдХ рдЖрд░рдВрднреАрдХрд░рдг #region Consts public readonly int TIME_BETWEEN_CONSOLE_OUTPUT_UPDATES = 1000; #endregion #region Fields private bool _outWatchEnabled; private bool _errWatchEnabled; private Task _outWatchTask; private readonly CancellationTokenSource _outWatchTaskToken = new CancellationTokenSource(); private int _lastOutSize = 0; private Task _errWatchTask; private readonly CancellationTokenSource _errWatchTaskToken = new CancellationTokenSource(); private int _lastErrSize = 0; private readonly StringBuilder _outStringBuilder; private readonly StringBuilder _errStringBuilder; private readonly Action _outWatchAction; private readonly Action<Task> _outWatchExcHandler; private readonly Action _errWatchAction; private readonly Action<Task> _errWatchExcHandler; private readonly CancellationTokenSource _scriptsToken = new CancellationTokenSource(); #endregion #region Properties public StringBuilder OutputBuilder { get { lock (SyncRoot) { return _outStringBuilder; } } } public StringBuilder ErrorBuilder { get { lock (SyncRoot) { return _errStringBuilder; } } } public bool IsConsoleOutputWatchingEnabled { get { lock (SyncRoot) { return _outWatchEnabled; } } set { lock (SyncRoot) { _outWatchEnabled = value; } } } public bool IsConsoleErrorWatchingEnabled { get { lock (SyncRoot) { return _errWatchEnabled; } } set { lock (SyncRoot) { _errWatchEnabled = value; } } } public event EventHandler<StringEventArgs> OutputUpdated; public event EventHandler<StringEventArgs> ErrorUpdated; #endregion
рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рд╕рдордп-рд╕рдордп рдкрд░, рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд▓реНрдбрд░реНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рд▓рдВрдмрд╛рдИ рдмрджрд▓ рдЧрдИ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░реНрд╕ (GUI рдкрдХреНрд╖ рдкрд░) рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рдВрджреЗрд╢ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬреАрдпреВрдЖрдИ рдХреА рдУрд░, рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЛрдб рдХреЛ рдЯрд╛рд╕реНрдХ рдХреЗ рдЕрдВрджрд░ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреАрдпреВрдЖрдИ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд╛рд░реНрдп рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рдеред рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдИрд╡реЗрдВрдЯ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдореЗрдВ рдЪрд┐рдХреЛрдЯреА рд▓реЗ рд░рд╣рд╛ рд╣реИ рдЬреЛ GUI рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЛрдб рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╣рдореЗрдВ рдПрдХ рдПрдХреНрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереНрд░реЗрдб рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдХреЗ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреАрдпреВрдЖрдИ рдкрдХреНрд╖ рдХреЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред
рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛрдб IRE.Instance.OutputUpdated += (s, args) => { string msg = string.Format("***\tIRE >> Out Updated callback\t***\nResult: {0}\n***\tEND\t***\n",args.Data); Debug.WriteLine(msg); var uiUpdateTask = Task.Factory.StartNew(() => { OutputLogList.Items.Add(msg); }, Task.Factory.CancellationToken, TaskCreationOptions.None, _uiScheduler); uiUpdateTask.Wait(); }; IRE.Instance.ErrorUpdated += (s, args) => { string msg = string.Format("!!!\tIRE >> Err Updated callback\t!!!\nResult: {0}\n!!!\tEND\t!!!\n", args.Data); Debug.WriteLine(msg); var uiUpdateTask = Task.Factory.StartNew(() => { ErrorLogList.Items.Add(msg); }, Task.Factory.CancellationToken, TaskCreationOptions.None, _uiScheduler); uiUpdateTask.Wait(); }; IRE.Instance.StartWatching();
рдпрд╣ рдХреЛрдб рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рд░рд┐рдлреНрд░реЗрд╢ рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд "
_uiScheduler " рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рдЗрд╕рдХреЗ (рд╡рд┐рдВрдбреЛрдЬрд╝) рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рдПрдХ рдХрдбрд╝реА рд╣реИред рдпрд╣ рд▓рд┐рдВрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
public MainWindow() { InitializeComponent(); _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); }
рдЗрд╕ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреАрдпреВрдЖрдИ рдереНрд░реЗрдб рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЪрд╛рд╣реЗ рд╡реЗ рдЬрд┐рд╕ рднреА рдереНрд░реЗрдб рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдВред рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдХреНрд░реЙрд╕-рдереНрд░реЗрдбрд┐рдВрдЧ рдПрдХреНрд╕реЗрд╕ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЕрдм рд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "
uiUpdateTask.Wait (); "ред "
рдХреЛрд╢рд┐рд╢ - рдкрдХрдбрд╝ " рдореЗрдВ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЛ рдлреНрд░реЗрдо рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдЯрд╛рд╕реНрдХ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЙрд╕ рдереНрд░реЗрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдХрд╛рд░реНрдп рдмрдирд╛рдпрд╛ рд╣реИред рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╡реЗрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рдЖрдк рдХрд╛рд░реНрдп рдореЗрдВ "рдирд┐рд░рдВрддрд░рддрд╛" рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдкрд╡рд╛рдж рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ
рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛
рдЪрд╛рд╣рд┐рдП ред рдЕрдиреНрдпрдерд╛, рдЕрдкрд╡рд╛рдж рдХреЛ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм "рдЧрд╛рд░рдмреЗрдЬрдХреЛрд▓реЗрдХреНрдЯрд░" рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реЛрдЧрд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдШрд╛рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ "
рдХреЛрд╢рд┐рд╢ - рдкрдХрдбрд╝ " рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЕрдм рдпрд╣рд╛рдБ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдпрд╣ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
public void StartWatching() { StopWatching(); if (_outWatchTask != null) _outWatchTask.Wait(); if (_errWatchTask != null) _errWatchTask.Wait(); IsConsoleOutputWatchingEnabled = IsConsoleErrorWatchingEnabled = true; _outWatchTask = Task.Factory.StartNew(_outWatchAction, _outWatchTaskToken.Token); _outWatchTask.ContinueWith(_outWatchExcHandler, TaskContinuationOptions.OnlyOnFaulted); _errWatchTask = Task.Factory.StartNew(_errWatchAction, _errWatchTaskToken.Token); _errWatchTask.ContinueWith(_errWatchExcHandler, TaskContinuationOptions.OnlyOnFaulted); }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рднреА рд╣реИред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ ("
рд╕реНрдЯреЙрдкрд╡реЙрдЪрд┐рдВрдЧ (); ")ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ "
IsConsoleOutputWatchingEnabled " рдФрд░ "
IsConsoleErrorWatchingEnabled " рдЭрдВрдбреЗ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ
, рдФрд░ "
рдХреИрдВрд╕рд▓реЗрд╢рдирдЯреЛрдХрди " рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдЯреЙрдк рдХреЛ рднреА рд░реЛрдХрддрд╛ рд╣реИред рдореИрдВ рдЦреБрдж рдХреЛ рд╕рд┐рд░реНрдл рдПрдХ рдЯреЛрдХрди рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдЯреЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЛрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдЯреЙрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рднреА рд╣реИ "
Task.Factory.CancellationToken.ThrowIfCancellationRested (); рдЬрд┐рд╕рдХрд╛ рдХреЙрд▓ рдХрд╛рд░реНрдп рдХреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдпрджрд┐ рдЯреЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ред рдЯреЛрдХрди рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред
рдЕрдЧрд▓реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ "
_outWatchTask.ContinueWith (_outWatchExcHandler, TaskContinuationOptions.OnlyOnFaulted); "ред рдпрд╣ рдХреЛрдб рдПрдХ рдХрд╛рд░реНрдп рдХреЛ рддрдерд╛рдХрдерд┐рдд "рдХрдВрдЯрд┐рдиреНрдпреВрдПрд╢рди" (рдирд┐рд░рдВрддрд░рддрд╛) рдкрд░ рд▓рдЯрдХрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд░рдВрддрд░рддрд╛ "
TaskContinuationOptions.OnlyOnFaulted " рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдХрд╛рд░реНрдп рдХреЗ "рдПрдЧреНрд░реАрдЧреЗрдЯреЗрдб рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди" рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдпрджрд┐ рдХреЛрдИ рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕реАрдХреНрд╡рд▓ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдИ рдЕрдкрд╡рд╛рдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рднреАрддрд░ рдиреЗрд╕реНрдЯреЗрдб рдЙрдк-рдореБрдЦреМрдЯреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм "
рдЬреАрд╕реА " рджреНрд╡рд╛рд░рд╛ рдиреЗрд╕реНрдЯреЗрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдЕрдЦрдВрдбрд┐рдд рдЕрдкрд╡рд╛рдж рдЙрд╕реА "рдПрдЧреНрд░реАрдЧреЗрдЯреЗрдб рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди" рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдкреЙрдк рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдиреЗрд╕реНрдЯреЗрдб рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдкреЗрдбрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдПрдХ рд╕рдкрд╛рдЯ рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ "
рдПрдЧреНрд░реАрдЧреЗрдЯреЗрдб рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди.рдлрд╝реНрд▓реИрдЯрди () " рд╣реИред
рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдмреЗрд╕рд┐рдХреНрд╕
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреА рд╣реАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ "ScriptEngine" рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХ .Net рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
_defaultEngine = Ruby.CreateEngine((setup) => { setup.ExceptionDetail = true; }); _defaultEngine.Runtime.LoadAssembly(typeof(IRE).Assembly);
рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд┐рдВрдЧрд▓рдЯрди рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬреЛрдбрд╝рд╛ред рдХреЛрдб рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ScriptEngine рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд▓реИрдореНрдмреНрдбрд╛ рдЖрдкрдХреЛ рдЗрдВрдЬрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯрдмрд╛рдЗрди рдХреЛ рд░реВрдмреА рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреА рд╣рд░ рдмрд╛рд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реЛред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬрдлреЛрди 7 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдореГрддрд┐ рдмрдЪрд╛рдУред рдореИрдВрдиреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЖрдЙрдЯрдкреБрдЯ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ред
рджреВрд╕рд░рд╛ рднрд╛рдЧ рдХреЗрд╡рд▓ рд░реВрдмреА рдЗрдВрдЬрди рдХреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд╣рдо рд▓рд┐рдкрд┐рдпреЛрдВ рд╕реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдЙрд╕реА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рддрд╛рдХрд┐ рдирдИ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдб рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╢реАрдЯ рдПрдХ рдЖрдВрдЦреЛрдВ рдХреА рд░реЛрд╢рдиреА рди рд╣реЛред
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдХрдИ рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХрд╛рд░реНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝рдирд╛ public Guid RunScriptAsync(string code) { var scriptScope = _defaultEngine.CreateScope(); CompiledCode compiledCode = null; try { ScriptSource scriptSource = _defaultEngine.CreateScriptSourceFromString(code, SourceCodeKind.AutoDetect); var errListner = new ErrorSinkProxyListener(ErrorSink.Default); compiledCode = scriptSource.Compile(errListner); } catch (Exception ex) { WriteError(ex.Message); return Guid.Empty; } var action = new Action(() => compiledCode.Execute(scriptScope)); var tokenSource = new CancellationTokenSource(); var task = new Task(action, tokenSource.Token, TaskCreationOptions.LongRunning); var guid = Guid.NewGuid(); AddTask(guid, new TaskRecord { TokenSource = tokenSource, Task = task }); task.Start(); task.ContinueWith((t) => {
рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ ScriptScope рдмрдирд╛рдПрдВред рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдмреА рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ ScriptScope рдХреА рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧреАред рд╕рднреА рдЪрд░ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рджрд╛рдпрд░рд╛ рдЗрди рджрд╛рдпрд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рд╣реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ "try - catch" рдХреЗ рдЕрдВрджрд░ ScriptSource рдФрд░ CompiledCode рдмрдирд╛рдП рдЧрдП рд╣реИрдВред "рдХреЛрд╢рд┐рд╢ - рдкрдХрдбрд╝" рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдмрдирд╛рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдЦрд╛рд▓реА рдЧрд╛рдЗрдб рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рддреЛ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдп рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ, рдПрдХ рдПрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдХреИрдВрд╕рд▓реЗрд╢рдирдЯреЙрдХрд╕реЗрдирд╕реЛрд░реНрд╕ рдмрдирд╛рдПрдВ, рдПрдХ рдирдпрд╛ рдЯрд╛рд╕реНрдХ "рдЯрд╛рд╕реНрдХ рдХреНрд░рд┐рдПрдЯрдСрдирдСрдХреНрд╢рдВрд╕.рд▓реЙрдиреНрдЧрдирд╛рдЗрдЯрд┐рдВрдЧ" рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрднрд╡рддрдГ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧреА)ред рдлрд┐рд░ рд╣рдо рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЗрд╕реЗ рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдПрдХ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдереАред
рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рд╣рдо рдХрд╛рд░реНрдп рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдп рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ, рд╣рдо рд▓реЙрдЧ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, "рдЕрдкрд╡рд╛рдж" рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ (
рд╡рд╛рдкрд╕реА рд╕рддреНрдп ) рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред
рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдПрдХ рдФрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рдХрд┐рд╕реА рднреА рдкреВрд░реНрдг рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ, рд╣рдо рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдЯрд╛рд╕реНрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рдВрдбреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ред рд╡рд┐рдВрдбреЛ рд▓реЗрдЖрдЙрдЯ рд╕рд░рд▓ рд╣реИред
<Window x:Class="IREngineTestBed.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Button x:Name="StartButton" Content="Start" Grid.Row="1" Margin="5" Height="25" Click="StartButton_Click"/> <Button x:Name="StopButton" Content="Stop" Grid.Row="1" Grid.Column="1" Margin="5" Height="25" Click="StopButton_Click"/> <ListBox x:Name="OutputLogList" Grid.Column="0" Margin="5"/> <ListBox x:Name="ErrorLogList" Grid.Column="1" Margin="5"/> </Grid> </Window>
рдирд┐рд╖реНрдХрд░реНрд╖
рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЛ ListBox'a рдФрд░ рджреЛ рдмрдЯрди рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд╛рд░рдг рдореИрдВрдиреЗ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдЧреНрд╕ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ (рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХред рдЯреЗрдХреНрд╕реНрдЯ + = "рдХреБрдЫ рд╕реНрдЯреНрд░рд┐рдВрдЧ" - рдПрдХ рдорд╣рд╛рди рдмреБрд░рд╛рдИ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди ListBoxes рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдмрд╕ рдкрд╛рда рдХреА рдирдХрд▓ рди рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, ListBox'y рдмрд╕ рдбрд╛рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП (рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ)ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рд╢рд╛рдпрдж RichTextBox рдХреЛ рдмрджрд▓ рджреВрдВрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд▓ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, "рд╕реНрдЯрд╛рд░реНрдЯрдмрдЯрди" рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░реНрд╕ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЬрд╛рддреА рд╣реИред рдмрдЯрди "рд╕реНрдЯреЙрдкрдмрдЯрди" - рд╕рдм рдХреБрдЫ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред
рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд▓реЙрдЧ рдХреЛ рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЗ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рдВрдЧрд▓рдЯрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВрдиреЗ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ "рд╕реНрд╡ред" рдпрд╛ "IRE" рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХрд┐рдпрд╛, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рд╢рд╛рдпрдж рдмрд╛рдж рдореЗрдВ рдХрд░реВрдБрдЧрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛)ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╣рдо рд▓реЙрдЧ рдХреЛ рд▓рд╛рдЗрди рдХрд╛ рдкрд╛рдВрдЪ рдЧреБрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдЕрдЧреНрд░реЗрд╖рдг рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдкрд╡рд╛рдж рд╕рд░реНрд╡рд┐рд╕ рд╕рд╛рдЗрдб рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

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