异步 CTP、NullReference 或 ArgumentNullException (Windows Phone)

Async CTP NullReference or ArgumentNullException (Windows Phone)

提问人:Michal 提问时间:5/9/2012 最后编辑:svickMichal 更新时间:5/10/2012 访问量:288

问:

我在项目中使用异步 CTP 库时遇到问题。 代码如下:

书页

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);
            }
        }
    }

图书经理

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.<>c_DisplayClass5.b
__1(对象) 状态)在 System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi、对象 obj、BindingFlags invokeAttr、Binder binder、对象 参数、CultureInfo 区域性、布尔值 isBinderDefault、程序集 调用者、布尔值 verifyAccess、StackCrawlMark&stackMark) 在 System.Reflection.RuntimeMethodInfo.InternalInvoke(对象对象 obj, BindingFlags invokeAttr、Binder binder、Object[] 参数、 CultureInfo culture, StackCrawlMark& stackMark) 在 System.Reflection.MethodBase.Invoke(Object obj, Object[] 参数) 在 System.Delegate.DynamicInvokeOne(Object[] args)
在 System.MulticastDelegate.DynamicInvokeImpl(Object[] args) 位于 System.Delegate.DynamicInvoke(Object[] args) 位于 System.Windows.Threading.DispatcherOperation.Invoke() 位于 System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) 在 System.Windows.Threading.Dispatcher.OnInvoke(Object context) 在 System.Windows.Hosting.CallbackCookie.Invoke(Object[] args) 在 System.Windows.Hosting.DelegateWrapper.InternalInvoke(对象 [] 参数)
在 System.Windows.RuntimeHost.ManagedHost.InvokeDelegate (IntPtr pHandle、Int32 nParamCount、ScriptParam[] pParams、ScriptParam& p结果)

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

.NET Windows-Phone-7 异步 NullReferenceException Async-CTP

评论

0赞 svick 5/10/2012
您是否尝试过调试代码?它究竟在哪里抛出异常?哪个变量是?null
0赞 Michal 5/11/2012
是的。但它是异步代码,我不知道在哪里抛出异常。有什么方法可以调试异步代码(也许是一些调试选项)?
0赞 svick 5/11/2012
我认为断点应该有效。因此,只需在 .await

答: 暂无答案