私はクライアントライブラリにアクセスできないときに、データセットを非同期的に取得する正しいコードを理解しようとしています。データ。エンドポイントと日付範囲を指定し、プレイリストのリストを取得するはずです。私が今Start()コールの後に戻ってくることはありません。注:これはWinFormで実行されています。私はタスクをよりよく理解しようとしており、待ち時間やBackgroundWorkerにジャンプしたいだけではありません。私はどこかで迷子になっているのを知っています。C#およびタスク - UIスレッドのハング - 事前非同期/ Awaitキーワード
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;
}
UPDATE 私は、これらの変更を行ったが、今のアプリケーションは、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);
}
'GetPlaylistsByDateRange'にブレークポイントを置くと、実際に呼び出されることがわかりますか? – user7116
他のスレッドプールスレッドではなくUIスレッドで実行されるように、継続コンテキストに同期コンテキストを渡す必要があります。それ以外は、私はここに本当の誤りは見当たりません。 – Servy
アップデートでは、UIスレッドの*すべての*タスクが実行されます。第2のものだけがそこで走らなければならない。 –