C# 将异步编程模型(Begin/End方法)转换为基于事件的异步模型?
假设我有使用异步编程模型的代码,即它作为一个组提供了以下方法,这些方法可以同步或异步使用:C# 将异步编程模型(Begin/End方法)转换为基于事件的异步模型?,c#,.net,asynchronous,iasyncresult,C#,.net,Asynchronous,Iasyncresult,假设我有使用异步编程模型的代码,即它作为一个组提供了以下方法,这些方法可以同步或异步使用: public MethodResult Operation(<method params>); public IAsyncResult BeginOperation(<method params>, AsyncCallback callback, object state); public MethodResult EndOperation(IAsyncResult ar);
public MethodResult Operation(<method params>);
public IAsyncResult BeginOperation(<method params>, AsyncCallback callback, object state);
public MethodResult EndOperation(IAsyncResult ar);
我想做的是用一个附加层来包装这段代码,将其转换为事件驱动的异步模型,如下所示:
public void OperationAsync(<method params>);
public event OperationCompletedEventHandler OperationCompleted;
public delegate void OperationCompletedEventHandler(object sender, OperationCompletedEventArgs e);
关于如何实现这一目标,是否有人提供了任何指导或此类指导的链接?有关这方面的一些想法,请参阅;所提供的代码使用回调方法,但如果将其放到实例上,事件将非常容易
public static void RunAsync<T>(
Func<AsyncCallback, object, IAsyncResult> begin,
Func<IAsyncResult, T> end,
Action<Func<T>> callback) {
begin(ar => {
T result;
try {
result = end(ar); // ensure end called
callback(() => result);
} catch (Exception ex) {
callback(() => { throw ex; });
}
}, null);
}
看看有没有关于这方面的想法;所提供的代码使用回调方法,但如果将其放到实例上,事件将非常容易
public static void RunAsync<T>(
Func<AsyncCallback, object, IAsyncResult> begin,
Func<IAsyncResult, T> end,
Action<Func<T>> callback) {
begin(ar => {
T result;
try {
result = end(ar); // ensure end called
callback(() => result);
} catch (Exception ex) {
callback(() => { throw ex; });
}
}, null);
}
可以使用AsyncFunc库创建包装器 代码如下所示:
public class Original
{
public ResultType Operation(ParamType param){...}
public IAsyncResult BeginOperation(ParamType param, AsyncCallback callback, object state){...}
public ResultType EndOperation(IAsyncResult ar){...}
}
public class Wrapper
{
private AsyncFunc<ParamType, ResultType> _operation;
private Original _original;
public Wrapper(Original original)
{
_original = original;
_operation = AsyncFunc<ParamType, ResultType>(_original.Operation);
}
public ResultType Operation(ParamType param)
{
return _original.Operation(param);
}
public void OperationAsync(ParamType param)
{
_operation.InvokeAsync(param)
}
public event AsyncFuncCompletedEventHandler<ResultType> OperationCompleted
{
add { _operation.Completed += value; }
remove { _operation.Completed -= value; }
}
}
注意,在这种方法中,您不需要定义自定义事件参数类和事件处理程序委托。可以用AsyncFunc泛型类型替换它们:
OperationCompletedEventArgs -> ResultType
OperationCompletedEventHandler -> AsyncFuncCompletedEventHandler<ResultType>
有关更高级的方案,请转到AsyncFunc主页。有一些视频和示例。您可以使用AsyncFunc库创建包装器 代码如下所示:
public class Original
{
public ResultType Operation(ParamType param){...}
public IAsyncResult BeginOperation(ParamType param, AsyncCallback callback, object state){...}
public ResultType EndOperation(IAsyncResult ar){...}
}
public class Wrapper
{
private AsyncFunc<ParamType, ResultType> _operation;
private Original _original;
public Wrapper(Original original)
{
_original = original;
_operation = AsyncFunc<ParamType, ResultType>(_original.Operation);
}
public ResultType Operation(ParamType param)
{
return _original.Operation(param);
}
public void OperationAsync(ParamType param)
{
_operation.InvokeAsync(param)
}
public event AsyncFuncCompletedEventHandler<ResultType> OperationCompleted
{
add { _operation.Completed += value; }
remove { _operation.Completed -= value; }
}
}
注意,在这种方法中,您不需要定义自定义事件参数类和事件处理程序委托。可以用AsyncFunc泛型类型替换它们:
OperationCompletedEventArgs -> ResultType
OperationCompletedEventHandler -> AsyncFuncCompletedEventHandler<ResultType>
有关更高级的方案,请转到AsyncFunc主页。这里有一些视频和示例。我想添加一个示例,但train out of Coverage Interesting-此代码样式与任务并行库非常相似。请稍后返回。。。至少在签名中,F在引擎盖下的工作方式并不遥远,因此我希望会有相似之处。我会添加一个示例,但train out out-Coverage有趣-此代码样式看起来与任务并行库非常相似。请稍后返回。。。至少在签名中,F在引擎盖下的工作方式并不遥远,所以我希望会有相似之处。