WP8 - 多个并发WebClient调用

时间:2013-12-02 15:08:11

标签: c# json windows-phone-8 webclient

我正在尝试从我的Windows Phone 8应用程序的在线RESTful源下载数据。总共大约有700个调用,每个调用都下载了一个可变长度的json字符串。 我一直在运行TargetInvocationExceptions,告诉我在大约65-80次调用之后发生http错误404(每次后续调用都会抛出此异常),但只有当我在循环中调用DownloadStringAsync方法时才会这样。每个下载json数据本身都可以完美地运行,因此可以使用在线源,并且内容也不会太大而无法处理。 我想我的执行时间有问题,但是到目前为止我找不到任何解决办法,但这仍然只是猜测。在这里打开任何建议。

这是我的代码(MainPage.xaml.cs):

namespace MyApp
{

    static MyViewModel ViewModel;

    public MainPage()
    {
        InitializeComponent();
        ViewModel = new MyViewModel();
        this.DataContext = ViewModel;
        GetData();
    }

    void GetData()
    {
        int id = 1;

        while (id <= 717)
        {
            GetJson(id++);
        }
    }

    void GetJson(int id)
    {
        string url = Connector.BaseURL + id + "/";
        WebClient client = new WebClient();
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(AddModelToViewModel);
        client.DownloadStringAsync(new Uri(url));
    }

    void AddModelToViewModel(object sender, DownloadStringCompletedEventArgs e)
    {
        try
        {
            string json = e.Result;

            MyModel Model = JsonConvert.DeserializeObject<MyModel>(json);
            ViewModel.Models.Add(Model);
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());                
        }
    }
}

我的ViewModel只包含

ObservableCollection<MyModel> Models

绑定到MainPage-View

中的ListView

我还是Windows Phone编程的新手,所以请原谅不好的风格:)

编辑:这肯定是一次请求太多的事情。将GetData()方法一次分成50个请求的块,从按钮开始按下工作没有问题。如下面的评论中所述,我认为服务器不会阻止我的请求。 Windowsphone方面有限制吗?

适用的控制台代码:

    static int count = 0;
    static void Main(string[] args)
    {
        for (int i = 1; i <= 717; i++)
        {
            WebClient client = new WebClient();
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DL);
            client.DownloadStringAsync(new Uri(BaseURL + i + "/"));
        }

        Console.ReadKey();
    }

    static void DL(object sender, DownloadStringCompletedEventArgs e)
    {
        Console.WriteLine("#" + ++count + ": " + (e.Error == null ? "No error." : "Error!"));
    }

0 个答案:

没有答案