ControlHelpers.cs
        
        
            
                    56 lines
            
             | 2.2 KiB
            
                | text/x-csharp
            
             |
                CSharpLexer
            
          
        
             / Implab.Fx / ControlHelpers.cs
          
          
          
      | 
              
  
   | 
            
            r3 | using System; | ||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Windows.Forms; | ||||
| namespace Implab.Fx | ||||
| { | ||||
| public static class ControlHelpers | ||||
| { | ||||
| /// <summary> | ||||
| /// Переключает обработку обещания в поток указанного элемента управления. | ||||
| /// </summary> | ||||
| /// <typeparam name="T">Тип результата обещания</typeparam> | ||||
| /// <param name="that">Исходное обещание</param> | ||||
| /// <param name="ctl">Элемент управления</param> | ||||
| /// <returns>Новое обещание, обработчики которого будут выполнены в потоке элемента управления.</returns> | ||||
| /// <exception cref="ArgumentNullException">Параметр не может быть <c>null</c>.</exception> | ||||
| /// <example> | ||||
| /// client | ||||
| /// .Get("description.txt") // returns a promise | ||||
| /// .DirectToControl(m_ctl) // handle the promise in the thread of the control | ||||
| /// .Then( | ||||
| /// description => m_ctl.Text = description // now it's safe | ||||
| /// ) | ||||
| /// </example> | ||||
| public static Promise<T> DirectToControl<T>(this Promise<T> that, Control ctl) | ||||
| { | ||||
| if (that == null) | ||||
| throw new ArgumentNullException("that"); | ||||
| if (ctl == null) | ||||
| throw new ArgumentNullException("ctl"); | ||||
| var directed = new Promise<T>(); | ||||
| that.Then( | ||||
| res => | ||||
| { | ||||
| if (ctl.InvokeRequired) | ||||
| ctl.Invoke(new Action<T>(directed.Resolve),res); | ||||
| else | ||||
| directed.Resolve(res); | ||||
| }, | ||||
| err => | ||||
| { | ||||
| if (ctl.InvokeRequired) | ||||
| ctl.Invoke(new Action<Exception>(directed.Reject), err); | ||||
| else | ||||
| directed.Reject(err); | ||||
| } | ||||
| ); | ||||
| return directed; | ||||
| } | ||||
| } | ||||
| } | ||||
