Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待的任务未异步运行_C#_Async Await_Linq To Twitter - Fatal编程技术网

C# 等待的任务未异步运行

C# 等待的任务未异步运行,c#,async-await,linq-to-twitter,C#,Async Await,Linq To Twitter,我试图异步下载一些twitter信息,但它阻止了UI线程。我用的是林克托维特(http://linqtotwitter.codeplex.com/)下载信息 这是对这项任务的要求 PublicTweetListBox.ItemsSource = await getTweets(twitterCtx); 这就是任务本身 async Task<List<TweetViewModel>> getTweets(TwitterContext twitterCtx) {

我试图异步下载一些twitter信息,但它阻止了UI线程。我用的是林克托维特(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;

}
异步任务getTweets(TwitterContext twitterCtx) { var tweetList=wait Task.FromResult( (来自twitterCtx.Status中的tweet) 其中tweet.Type==StatusType.User &&tweet.ScreenName==用户名.Text 选择新的TweetViewModel { Name=tweet.User.Name, Tweet=Tweet.Text, ImageUrl=tweet.User.ProfileImageUrl }) .ToList()); 返回tweetList; }
我等待下载列表的方式有问题,TweetViewModel是一种自定义类型,如果有帮助的话。

它阻塞了UI线程,因为这就是
await
的目的。:)

wait运算符应用于异步方法中的任务,以 暂停方法的执行,直到等待的任务完成。 这项任务是正在进行的工作


在我看来,这是对异步编程以同步方式工作的“攻击”。要在后台加载项目并在完成时更新
ItemSource
,请使用工作线程和调用“Dispatcher.Invoke”以使用结果更新
ItemSource

async
wait
不要神奇地使阻塞代码成为非阻塞代码。linqtotwitter不是一个异步API,将它粘贴到
任务中。FromResult
将不起任何作用


如果要将查询推送到后台线程,可以使用
Task.Run
而不是
Task.FromResult
。一个更有效(但更复杂)的解决方案是使用异步twitter API。

前面的答案很好,我只想补充一下。LINQ不支持C#5.0异步,因此我使用LINQ to Twitter来支持它:

    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,resp类型的参数,其中T是实体类型。在本例中,T是搜索。resp.Status让您知道调用期间是否引发异常,并允许您通过resp.Error属性进行访问。resp.State允许您访问IEnumerable,这是一个包含元数据和状态实体列表(tweets)的单个搜索实体

底层HTTP调用确实是异步执行的,尽管它们使用APM,而不是C#5.0异步。我计划在将来研究async closer的查询和命令,但是LINQ to Twitter今天使用的是非常有效的


await
被赋予一个尚未完成的操作时,它会暂停方法的执行,不会阻塞线程。谢谢,我将研究任务。运行,也许是另一个API。非常感谢Joe!到目前为止,我很喜欢linqtotwitter,我期待异步支持,继续做好工作