I wrote a little method to navigate a `WebBrowser` control asynchronously and returns `DocumentResult`, yet i wanna know if this is a good approach for solving such problem.

Code

    SemaphoreSlim _ = new SemaphoreSlim(1);
    
    public async Task<string> NavigateAsync(string url, string targetFrameName = null, byte[] postData = null, string additionalHeaders = null, CancellationToken c = default(CancellationToken))
    {
        await _.WaitAsync(c);
    
        var o = new TaskCompletionSource<string>(null);
        #pragma warning disable 4014
        Task.Factory.StartNew(() =>
        #pragma warning restore 4014
        {
            void OnDocumentCompleted(object x, WebBrowserDocumentCompletedEventArgs e)
            {
                DocumentCompleted -= OnDocumentCompleted;
    
                _.Release();
                o.SetResult(DocumentText);
            }
    
            Navigate(url, targetFrameName, postData, additionalHeaders);
            DocumentCompleted += OnDocumentCompleted;
        }, c);
        return await o.Task;
    }