Migracja z eventów na async

0

Witam,
jak poradzić sobie w takiej sytuacji:
dla uproszczenia pseudo kod

class HtmlDownloader
    {
        private OnDownloadComplete onDownloadCompleteHandler;

        public delegate void OnDownloadComplete(string resultHtml);

        public HtmlDownloader(OnDownloadComplete onDownloadComplete)
        {
            onDownloadCompleteHandler += onDownloadComplete;
        }

        public void StartDownloadHtml()
        {
            Browser b = new Browser();
            b.DocumentCompleted += Browser_DocumentCompleted;
            b.GetMyHtml("url");
        }

        private void Browser_DocumentCompleted(object sender, EventArgs e)
        {
            onDownloadCompleteHandler("returnDownloadedHtml");
        }
    }

Wynik metody StartDownloadHtml() zwracany jest przez delegata w odpowiedzi na event klasy Browser.
W jaki sposób i czy w ogóle mogę zrefaktoryzować tę metodę na
public string async GetHtml(), żeby pozbyć się tego delegata OnDownloadComplete?

1

Użyj TaskCompletionSource. Mniej więcej tak:

public async Task<string> StartDownloadHtmlAsync()
{
    var tcs = new TaskCompletionSource<string>(); 
    var b = new Browser();
    b.DocumentCompleted += (s, e) => {
        tcs.SetResult(e.DownloadedHtml);
    }

    b.GetMyHtml("url");

    return tcs.Task;
}

http://stackoverflow.com/questions/9963301/turn-event-into-a-async-call

1 użytkowników online, w tym zalogowanych: 0, gości: 1