在C# 如果我有一个函数接受 callback,可以用 Task 来阻止回调扩散吗?

发布于 2022-09-01 22:29:39 字数 365 浏览 9 评论 0

假设我已经实现了这样的函数:

delegate Result ResponseDelegate(object identifier);

void AddCallback(object identifier, ResponseDelegate callback);

现在我希望通过一种同步式的接口来获取结果(阻止回调式的代码扩散),可以用 Task 或者其他库来做到吗?

具体来说就是,通过实现一个

Task<Result> GetResult(object identifier);

或者其他近似形式的方法(不带有回调)来获取 Result 是有可能的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鸵鸟症 2022-09-08 22:29:39

按照类型来看,你要的不就是这个构造函数吗(https://msdn.microsoft.com/en-us/library/dd321458(v=vs.110).aspx)?

我总有一种你的ResponseDelegate的参数和返回值类型颠倒了的感觉,如果不对的话,你的内部结构反正也得有典型的异步函数的特征。在这里我给你介绍一下 TaskCompleteSource 类:

// 假设你有标准的async行为的旧函数
IAsyncResult BeginDoSomething(object identifier, Action<IAsyncResult> callback);
Result EndDoSomething(IAsyncResult asyncResult);

Task<Result> DoSomethingAsync(object identifier)
{
    var t = new TaskCompleteSource<Result>();
    BeginDoSomething(identifier, r=>
    {
        t.TrySetResult(EndDoSomething(r));
    });
    return t.Task;
}

如果你的意思是说,你AddCallback之后,这个函数就会被随便找一个线程(譬如QueueUserWorkItem)来执行,然后你可以通过GetResult来获取那个Task。那么你大概可以这么做:

Dictionary<object, Task<Result>> tasks = {};

void AddCallback(object identifier, Func<object, Result> callback)
{
    var t = new TaskCompleteSource<Result>();
    tasks.Add(identifier, t.Task);
    
    ThreadPool.QueueUserWorkItem(id=>
    {
        t.TrySetResult(callback(id));
    }, identifier);
}

Task<Result> GetResult(object identifier)
{
    return tasks[identifier];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文