c#中的异步调用

时间:2015-04-22 17:15:20

标签: c#-4.0 asynchronous linq-to-twitter

当我执行我开发的代码来调用linq2Twitter的Async方法时,我得到一个System.Aggregate Exception,代码如下:

static async Task<List<myTwitterStatus>> getRetweets(ulong tweetID, TwitterContext twitterCtx)        
{
    List<myTwitterStatus> reTweets = new List<myTwitterStatus>();

    var publicTweets =
        await
        (from tweet in twitterCtx.Status
         where tweet.Type == StatusType.Retweets &&
               tweet.ID == tweetID
         select tweet)
         .ToListAsync();

    if (publicTweets != null)
        publicTweets.ForEach(tweet =>
        {
            if (tweet != null && tweet.User != null)
            {
                myTwitterStatus tempStatus = new myTwitterStatus();
                tempStatus.Country = tweet.Place.Country;
                tempStatus.createdAt = tweet.CreatedAt;
                tempStatus.FavoriteCount = long.Parse(tweet.FavoriteCount.ToString());
                tempStatus.ID = tweet.ID;
                tempStatus.isTruncated = tweet.Truncated;
                tempStatus.Lang = tweet.Lang;
                tempStatus.MaxID = tweet.MaxID;
                tempStatus.PlaceFullname = tweet.Place.FullName;
                tempStatus.RetweetCount = tweet.RetweetCount;
                tempStatus.ScreenName = tweet.ScreenName;
                tempStatus.Text = tweet.Text;
                tempStatus.UserFriends = tweet.User.FriendsCount;
                tempStatus.UserCreated = tweet.User.CreatedAt;
                tempStatus.UserFollowers = tweet.User.FollowersCount;
                tempStatus.UserFavorities = tweet.User.FavoritesCount;
                tempStatus.UserFriends = tweet.User.FriendsCount;
                tempStatus.UserLocation = tweet.User.Location;
                tempStatus.UserName = tweet.User.Name;
                tempStatus.UserTweetCount = tweet.User.StatusesCount;
                reTweets.Add(tempStatus);
            }
        });
        return reTweets;    
    }

问题在于我调用方法

var authorizer = new SingleUserAuthorizer
{
    CredentialStore = new InMemoryCredentialStore
    {
        ConsumerKey = SM.Default.Consumer_key2.ToString(),
        ConsumerSecret = SM.Default.Consumer_secret2.ToString(),
        OAuthToken = SM.Default.Access_token2.ToString(),
        OAuthTokenSecret = SM.Default.Access_secret2.ToString()
    }
};
TwitterContext twitterCtx = new TwitterContext(authorizer);

Task<List<myTwitterStatus>> task = Task<List<myTwitterStatus>>.Factory.StartNew(() => getRetweets(ulong.Parse(tweet.StringId), twitterCtx).Result);
task.Wait();                    
List<myTwitterStatus> tempList = task.Result.ToList<myTwitterStatus>();

foreach (var ret in tempList)
{
    un = file.RemoveSpecialCharacters(ret.UserName);
    sn = file.RemoveSpecialCharacters(ret.ScreenName);

    tweets.AppendLine(account + "," + getWE(ret.createdAt) + "," + Text + "," + un + "," + sn + "," + ret.createdAt + "," +
    file.RemoveSpecialCharacters(ret.UserLocation) + ",,,1,," + ret.UserTweetCount + "," +
    ret.RetweetCount + "," + ret.FavoriteCount + "," + ret.UserFollowers);

我很感激任何有关它的帮助,我不知道如何解决它。

2 个答案:

答案 0 :(得分:0)

你可以添加一个try / catch,看看内部异常是什么。

try
{
    //Perform your operation here
}
catch (AggregateException aex)
{
    //Dive into inner exception
}

答案 1 :(得分:0)

感谢大家的帮助,我激活了特定异常的断点,并添加了一个额外的验证,问题不在异步过程中,这是因为它试图将null作为字符串处理,而不是hendle此错误修改了这一行sn = file.RemoveSpecialCharacters(ret.ScreenName ?? string.Empty);

完整代码如下:

   private void getRetweets(TwitterStatus tweet)
    {
        Text = file.RemoveSpecialCharacters(tweet.Text);
        tweetID = tweet.StringId;

        #region Get retweets
        RetweetsOptions retOpt = new RetweetsOptions();
        if (int.Parse(tweet.RetweetCountString.ToString()) > 1)
                retOpt.Count = int.Parse(tweet.RetweetCountString.ToString()) + 1;
            else
                retOpt.Count = 1;

        String errorText = "";

        DateTime fromDate, toDate;
        if (radDate.Checked == true)
        {
            fromDate = dtpFrom.Value;
            toDate = dtpTo.Value;
        }
        else
        {
            fromDate = tweet.CreatedDate;
            toDate = DateTime.Now;
        }

        TwitterResponse<TwitterStatusCollection> retweet = null;

        if (int.Parse(tweet.RetweetCountString.ToString()) > 100)
        {                                
            var authorizer = new SingleUserAuthorizer
            {
                CredentialStore = new InMemoryCredentialStore
                {
                    ConsumerKey = SM.Default.Consumer_key2.ToString(),
                    ConsumerSecret = SM.Default.Consumer_secret2.ToString(),
                    OAuthToken = SM.Default.Access_token2.ToString(),
                    OAuthTokenSecret = SM.Default.Access_secret2.ToString()
                }
            };
            TwitterContext twitterCtx = new TwitterContext(authorizer);

            //HELPER: https://www.youtube.com/watch?v=IONqMWGn9-w                                
            try
            {                        
                Task<List<myTwitterStatus>> task = null;
                Parallel.Invoke(
                    () =>
                    {
                        task = getRetweets(ulong.Parse(tweet.StringId), twitterCtx);
                        while (!task.IsCompleted)
                        {
                            Thread.Sleep(250);
                        }
                    });



                List<myTwitterStatus> tempList = task.Result.ToList<myTwitterStatus>();

                foreach (var ret in tempList)
                {
                    un = file.RemoveSpecialCharacters(ret.UserName);
                    sn = file.RemoveSpecialCharacters(ret.ScreenName ?? string.Empty);

                    tweets.AppendLine(account + "," + getWE(ret.createdAt) + "," + Text + "," + un + "," + sn + "," + ret.createdAt + "," +
                            file.RemoveSpecialCharacters(ret.UserLocation) + ",,,1,," + ret.UserTweetCount + "," +
                            ret.RetweetCount + "," + ret.FavoriteCount + "," + ret.UserFollowers);
                }
            }catch(Exception ex){
                Console.WriteLine("Error: " + ex.Message+ Environment.NewLine + ex.StackTrace);
            }
            return;
        }
        else
            retweet= TwitterStatus.Retweets(tokensRet, Decimal.Parse(tweet.Id.ToString()), retOpt);


        if (retweet.Result.ToString() == "Success" && retweet.ResponseObject.Count > 0 && retweet!=null)
        {                
            int retPages = int.Parse(tweet.RetweetCountString.ToString()) + 1 / 20;

            for (int page = 0; page <= retPages; page++)
            {
                try
                {
                    //List<TwitterStatus> retList = new List<TwitterStatus>(retweet.ResponseObject.Page = page);                    
                    retweet.ResponseObject.Page = page;
                    List<TwitterStatus> retList = retweet.ResponseObject.ToList<TwitterStatus>();

                    foreach (var ret in retList)
                    {

                        try
                        {
                            if (ret.CreatedDate.CompareTo(fromDate) >= 0 && ret.CreatedDate.CompareTo(toDate) <= 0)
                            {
                                #region Get UN Sync
                                getUN(ret, ref un, ref sn);
                                #endregion

                                tweets.AppendLine(account + "," + getWE(ret.CreatedDate) + "," + Text + "," + un + "," + sn + "," + ret.CreatedDate + "," +
                                    file.RemoveSpecialCharacters(ret.User.Location.ToString()) + ",,,1,," + ret.User.NumberOfStatuses.ToString() + "," +
                                    ret.RetweetCount + "," + ret.User.NumberOfFavorites.ToString() + "," + ret.User.NumberOfFollowers.ToString());

                            }
                            else if (tweet.CreatedDate.CompareTo(toDate) <= 0)//if the tweet's created date is lower than the from's date, exits the loop
                                break;
                        }
                        catch (NullReferenceException ex)
                        {
                            errorText = ex.Source + Environment.NewLine + ex.StackTrace;
                            continue;
                        }

                    }
                }
                catch (Exception ex)
                {
                    errorText = ex.Source + Environment.NewLine + ex.StackTrace;
                    //MessageBox.Show(ex.Message + Environment.NewLine + "Rate Limit was reached!" + Environment.NewLine +
                    //    "Wait an hour or try a shorter date range", "Rate Limit Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
        }
        else if (error == false && retweet.Result.ToString() != "Success")
        {
            errorText = retweet.Result.ToString();
            MessageBox.Show("Retweets: Something went wrong!" + Environment.NewLine + errorText, "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            error = true;
        }
    #endregion
    }
相关问题