ControlHelpers.cs
56 lines
| 2.2 KiB
| text/x-csharp
|
CSharpLexer
/ Implab.Fx / ControlHelpers.cs
cin
|
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; | ||||
} | ||||
} | ||||
} | ||||