我正在引用一个类,该类使用回调而不是异步操作来执行各种要求苛刻的操作。例如:
class CallbackClass : SomeSdkCallbacks
{
public void RequestData()
{
// We call this to request some data.
// After some time, this will trigger OnDataReturned to be called
}
public void OnDataReturned(DataObject data)
{
// This will be called automatically with returned data via SomeSdkCallbacks
}
}
在整个类(class)中有许多此类结构的实例。
我想做的是围绕这个类创建一个包装类,以简化它的使用。我现在要使用的结构是:
class MyWrapperClass
{
CallbackClass CallbackClass;
public MyWrapperClass()
{
this.CallbackClass = new CallbackClass();
}
public DataObject GetData()
{
this.CallbackClass.RequestData();
// Somehow wait until this.CallbackClass.OnDataReturned is called?
// Somehow get the data that would be passed in to this.CallbackClass.OnDataReturned()???
}
}
将“回调”架构封装到单个异步方法中的最佳方法是什么?
编辑:澄清一下,理想情况下我想将其打包成一个方法,可以在单个请求中返回数据。请参阅示例中的 MyWrapperClass.GetData()
方法以了解我的理想结构。
编辑 2:我知道这种理想的架构形式不佳。不幸的是,这是我要求的结构。
最佳答案
我想这就是你想要的:
class CallbackClass<T>
{
private TaskCompletionSource<T> task = new TaskCompletionSource<T>();
public void RequestData()
{
}
public void OnDataReturned(T data)
{
task.SetResult(data);
}
public Task<T> Task { get { return task.Task; } }
}
class MyWrapperClass
{
public Task<DataObject> GetData()
{
var cls = new CallbackClass<DataObject>();
cls.RequestData();
return cls.Task;
}
}
请注意,必须为每个操作创建 TaskCompletionSource
,这样您就不会对两个不同的调用使用同一个。有了这个,您可以使用 async
关键字。 This可能会有更多帮助。
关于c# - 将基于回调的类包装为异步类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45634013/