5

データの取得に使用しているクライアント ライブラリにアクセスできない場合に、一連のデータを非同期的に取得するための正しいコードを理解しようとしています。エンドポイントと日付範囲を指定すると、プレイリストのリストを取得することになっています。Start() 呼び出しの後、私が今持っているものは二度と戻ってきません。注: これは WinForm で実行されています。私は Tasks をよりよく理解しようとしていますが、awaits または BackgroundWorker にジャンプしたいだけではありません。私はどこかで迷子になっていることを知っています。

    private void GoButtonClick(object sender, EventArgs e)
    {
        string baseUrl = "http://someserver/api";
        var startDateTime = this._startDateTimePicker.Value;
        var endDateTime = this._endDateTimePicker.Value;
        _getPlaylistsFunc = delegate()
            {
                var client = new PlaylistExportClient(baseUrl);
                return client.GetPlaylistsByDateRange(startDateTime, endDateTime).ToList();
            };
        var task = new Task<List<Playlist>>(_getPlaylistsFunc);
        task.ContinueWith((t) => DisplayPlaylists(t.Result));
        task.Start();
    }

    private void DisplayPlaylists(List<Playlist> playlists)
    {
        _queueDataGridView.DataSource = playlists;
    }

更新 これらの変更を行いましたが、アプリケーションが UI スレッドをハングさせているようです。

    private void GoButtonClick(object sender, EventArgs e)
    {
        string baseUrl = "http://someserver/api";
        var startDateTime = this._startDateTimePicker.Value;
        var endDateTime = this._endDateTimePicker.Value;
        var token = Task.Factory.CancellationToken;

        var context = TaskScheduler.FromCurrentSynchronizationContext();
        Task.Factory.StartNew(() =>
            {
                var client = new PlaylistExportClient(baseUrl);
                _queueDataGridView.DataSource = client.GetPlaylistsByDateRange(startDateTime, endDateTime).ToList();

            },token,TaskCreationOptions.None,context);

    }
4

2 に答える 2