代码之家  ›  专栏  ›  技术社区  ›  Léster

以异步方式调用同步方法?

  •  1
  • Léster  · 技术社区  · 7 年前

    System.DirectoryServices.Protocols 类和方法,是同步的且不可修改的。

    • 用一个异步方法包装它是一个好主意吗?
    • 异步调用的正确方法是什么?(是 await Task.Run(() => Search(params))
    2 回复  |  直到 7 年前
        1
  •  5
  •   Lucero    7 年前

    正如评论中提到的,我不认为异步调用有什么帮助。在另一个线程中运行它并等待(根据您的“what is the property way…”问题)确实使用了与同步调用和等待一样多的资源。

    System.DirectoryServices.Protocols 例如 LdapCollection 使用较旧的APM(异步编程模型)样式(例如。 BeginSendRequest / EndSendRequest ).

    您可以使用 TaskFactory<TResult>.FromAsync ,这将是将这些类与async一起使用的“正确方法”。另见 Interop with Other Asynchronous Patterns and Types .

        2
  •  0
  •   Léster    7 年前

    Task<T> 异步方法:

    public static async Task<DirectoryResponse> SendRequestAsync(this LdapConnection conn, string target, string filter,
        SearchScope searchScope, params string[] attributeList)
    {
        if (conn == null)
        {
            throw new NullReferenceException();
        }
        var search_request = new SearchRequest(target, filter, searchScope, attributeList);
        var response = await Task<DirectoryResponse>.Factory.FromAsync(
            conn.BeginSendRequest,
            (iar) => conn.EndSendRequest(iar),
            search_request,
            PartialResultProcessing.NoPartialResultSupport,
            null);
        return response;
    }