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

标签 c# .net asynchronous callback

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

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/

相关文章:

c++ - 连续两次async_write出现问题

c# - 使用 RestSharp 反序列化 JSON

c# - 缺少样式字段 MvxExpandableListView_GroupItemTemplate

c# - 如何为泛型提供默认类型?

.net - 温莎城堡3(CaSTLe Windsor 3),构造函数参数为字符串

javascript - 如何在 Node.js 上阻塞进程并等待结果?

arrays - 嵌套在 async.eachSeries 循环中的 async.series 终止提前发送 POST 响应

c# - 更好的逻辑来检查财政年度日期

c# - Windows MIDI流和SysEx

c# - 如何检查 string.IsNullOrEmpty 和 IsDateEmpty 的所有可见行 CELL