Async CTP NullReference或ArgumentNullException(Windows Phone)

时间:2012-05-09 15:52:37

标签: .net windows-phone-7 asynchronous nullreferenceexception async-ctp

我在项目中使用Async CTP库时遇到问题。 这是代码:

BookPage

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        if (this.DataContext is BookViewModel)
        {
            var bookViewModel = this.DataContext as BookViewModel;
            bookViewModel.UpdateReviews();
        }
    }

BookViewModel

public async void UpdateReviews()
    {
        Reviews.Clear();

        IEnumerable<Review> newReviews = null;
        try
        {
            newReviews = await BooksManager.GetBookReviews(this.Book.Sysno, 10, 0);
        }
        catch (Exception ex)
        {

        }

        if (newReviews != null)
        {
            foreach (var review in newReviews)
            {
                Reviews.Add(review);
            }
        }
    }

BooksManager

public static async Task<IEnumerable<Review>> GetBookReviews(string sysno, uint limit, uint offset)
    {
        if (sysno == null)
            throw new ArgumentNullException("sysno");
        if (string.IsNullOrWhiteSpace(sysno))
            throw new ArgumentException("sysno");

        string url = CreateBookReviewsURL(sysno, limit, offset);

        var reviews = await DownloadDataAsync<IEnumerable<Review>>(url);
        return reviews;
    }

public static async Task<T> DownloadDataAsync<T>(string url)
    {
        if (url == null)
            throw new ArgumentNullException("url");

        var newUrl = url.Contains("?") ? 
            string.Format("{0}d={1}", url, DateTime.Now) :
             string.Format("{0}?d={1}", url, DateTime.Now); //to avoid caching

        string data = null;

        WebRequest webRequest = WebRequest.CreateHttp(newUrl);

        using (WebResponse response = await webRequest.GetResponseAsync())
        {

            if (response.Headers["StatusCode"] == "200")
            {
                using (var stm = response.GetResponseStream())
                {
                    using (var reader = new StreamReader(stm))
                    {
                        data = await reader.ReadToEndAsync();
                    }
                }
            }
        }

        var books = await ParseDataAsync<T>(data);
        return books;
    }

抛出NullReferenceException

  

在   SmartLib.ViewModels.BooksViewModel.d_ 8.MoveNext()
  在   System.Runtime.CompilerServices.TaskAwaiter&LT;。&以及c
_DisplayClass5.b__1(对象   国家)   System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo   rtmi,Object obj,BindingFlags invokeAttr,Binder binder,Object   参数,CultureInfo文化,布尔isBinderDefault,汇编   调用者,布尔验证访问,StackCrawlMark&amp; stackMark)at   System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj,   BindingFlags invokeAttr,Binder binder,Object []参数,   CultureInfo culture,StackCrawlMark&amp; stackMark)at   System.Reflection.MethodBase.Invoke(Object obj,Object []参数)
  在System.Delegate.DynamicInvokeOne(Object [] args)at   System.MulticastDelegate.DynamicInvokeImpl(Object [] args)at   System.Delegate.DynamicInvoke(Object [] args)at   System.Windows.Threading.DispatcherOperation.Invoke()at   System.Windows.Threading.Dispatcher.Dispatch(的DispatcherPriority   System.Windows.Threading.Dispatcher.OnInvoke(Object。的优先级)   System.Windows.Hosting.CallbackCookie.Invoke(Object []上下文)   args)at   System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object [] args)
  在System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr   pHandle,Int32 nParamCount,ScriptParam [] pParams,ScriptParam&amp;   pResult)

在App.xaml.cs中调用BooksManager.GetBookReviews()可以正常工作。

0 个答案:

没有答案