gpt4 book ai didi

c# - 将基于回调的类包装为异步类

转载 作者:行者123 更新时间:2023-12-04 03:10:33 24 4
gpt4 key购买 nike

我正在引用一个类,该类使用回调而不是异步操作来执行各种要求苛刻的操作。例如:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com