3

Twitter の情報を非同期でダウンロードしようとしていますが、UI スレッドがブロックされています。LinqToTwitter (http://linqtotwitter.codeplex.com/) を使用して情報をダウンロードしています。

これがタスクへの呼び出しです

PublicTweetListBox.ItemsSource = await getTweets(twitterCtx);

そして、ここにタスク自体があります

async Task<List<TweetViewModel>> getTweets(TwitterContext twitterCtx)
{       
    var tweetList = await Task.FromResult<List<TweetViewModel>>(
    (from tweet in twitterCtx.Status
    where tweet.Type == StatusType.User
    && tweet.ScreenName == UserName.Text
    select new TweetViewModel
    {
        Name = tweet.User.Name,
        Tweet = tweet.Text,
        ImageUrl = tweet.User.ProfileImageUrl
    })
    .ToList());

    return tweetList;

}

リストをダウンロードするのを待っている方法で何か間違ったことをしています.TweetViewModelはカスタムタイプです.

4

3 に答える 3

5

asyncawaitブロッキング コードを魔法のようにノンブロッキングにしないでください。Linq-to-twitter は非同期 API でTask.FromResultはありません。

クエリをバックグラウンド スレッドにプッシュする場合は、Task.Run代わりにTask.FromResult. より効率的な (ただしより複雑な) ソリューションは、非同期の Twitter API を使用することです。

于 2012-11-28T05:11:35.953 に答える
1

以前の回答は良かったので、今までの話に加えたいと思います。LINQはC#5.0非同期をサポートしていないため、LINQtoTwitterでサポートするために行ったことは次のとおりです。

    static void AsyncSearchSample(TwitterContext twitterCtx)
    {
        (from search in twitterCtx.Search
         where search.Type == SearchType.Search &&
               search.Query == "LINQ To Twitter"
         select search)
        .MaterializedAsyncCallback(resp =>
        {
            if (resp.Status != TwitterErrorStatus.Success)
            {
                Exception ex = resp.Error;
                // handle error
                throw ex;
            }

            Search srch = resp.State.First();
            Console.WriteLine("\nQuery: {0}\n", srch.SearchMetaData.Query);

            srch.Statuses.ForEach(entry =>
                Console.WriteLine(
                    "ID: {0, -15}, Source: {1}\nContent: {2}\n",
                    entry.ID, entry.Source, entry.Text));
        });
    }

MaterializedAsyncCallbackは、タイプTwitterAsyncResult <IEnumerable <T >>、respのパラメーターを取ります。ここで、Tはエンティティタイプです。この例では、Tは検索です。resp.Statusは、呼び出し中に例外が発生したかどうかを通知し、resp.Errorプロパティを介してアクセスできるようにします。resp.Stateを使用すると、IEnumerable <T>にアクセスできます。これは、メタデータとステータスエンティティ(ツイート)のリストを含む単一の検索エンティティです。

基になるHTTP呼び出しは非同期で実行されますが、C#5.0非同期ではなくAPMを使用します。将来的には、クエリとコマンドの両方について非同期を詳しく調べる予定ですが、LINQtoTwitterが現在使用しているものは非常に効果的です。

@ジョーマヨ

于 2012-11-30T02:33:51.357 に答える
-1

awaitそれが意図されているため、UIスレッドをブロックしています。:)

await 演算子は、非同期メソッドのタスクに適用され、待機中のタスクが完了するまでメソッドの実行を中断します。タスクは進行中の作業を表します。

http://msdn.microsoft.com/en-us/library/hh156528.aspx

IMO これは、非同期プログラミングを同期的に機能させるための「ハック」です。バックグラウンドでアイテムをロードし、ItemSource完了時に を更新するには、ワーカー スレッドと「Dispatcher.Invoke」への呼び出しを使用しItemSourceて、結果で を更新します。

于 2012-11-28T04:39:30.743 に答える