任务覆盖任务

时间:2013-10-06 14:04:17

标签: c# asynchronous windows-phone-7.1

我有一项从我的服务器获取内容的任务。问题是,有时任务会覆盖任务,所以我得到两次相同的结果。

我的代码:

 Task<string> task = Server.GetText();
        string result = await task;
        if (result == "\n")
        {
            .....
        }
        else
        {
            string[] sarray = result.Split('|');

            App.MainList.Add(new etc.Text(sarray[0], sarray[1], sarray[2], sarray[3], sarray[4]));

            App.Number++;
        }

的getText():

public static async Task<string> GetText()
    {
        if (App.Number <= App.Total)
        {
            HttpClient http = new System.Net.Http.HttpClient();
            HttpResponseMessage response = await http.GetAsync(queryuri + "?w=" + App.Number.ToString());
            return await response.Content.ReadAsStringAsync();
        }

        else
        {
            App.Number = 1;
            HttpClient http = new System.Net.Http.HttpClient();
            HttpResponseMessage response = await http.GetAsync(queryuri + "?w=" + App.Number.ToString());
            return await response.Content.ReadAsStringAsync();
        }

    }

2 个答案:

答案 0 :(得分:2)

  

我的意思是覆盖旧的结果,最后我必须编写条目。我该如何解决这个问题呢?

当第一种方法进入时(可能是因为按下用户按钮),您使用GetText()来调用await;当您第一次执行此操作时,我们假设App.Number1。由于await执行暂停,直到GetText()返回,但您的GUI不是!让我们假设用户再次按下相同的按钮。将再次调用GetText()App.Number仍为1,因为第一个GetText()尚未返回。由于查询是基于App.Number构建的,因此您显然会获得两个相同的结果。

当第一个GetText()返回时,您将增加App.Number,所以它现在是2;当第二个GetText()返回时,App.Number再次实施!您不仅要获得App.Number==1两次的结果,还要完全跳过App.Number==2的结果!

根据这些数字的含义,你有多种解决方案:在调用App.Number之前递增GetText()并将数字作为参数传递,使方法不可重入,无论对你有用。例如,如果请求的顺序有一些含义,那么最好的选择是禁用按钮,因为并行发送的HTTP请求不能保证按启动顺序完成。例如,您GetText(2)可以在GetText(1)之前轻松返回;由于某些错误,GetText(n)也可能永远不会返回。

你现在知道为什么你会看到你所看到的,但我无法提出解决方案,因为我实际上并不知道应该采取什么样的正确行为。这取决于你!

答案 1 :(得分:0)

这看起来像是一个线程问题。我假设App.Number从1开始,App.Total是4,但我认为它会发生App.Number&lt; = App.Total。

的任何值。

初始代码在两个不同的线程上触发,两个线程都开始运行Server.GetText(),然后点击if语句,选择第一个分支,构建URL并发出w = 1的请求。由于此调用需要时间,并且之后的App.Number增量为,因此我认为这是导致您出现问题的原因。

我认为您的问题是,您需要在阅读后立即更新App.Number以构建URL(并在读取/递增时保持锁定,以便您仍然没有竞争条件)。 / p>