0

我的任务是从我的服务器获取内容。问题是,有时任务会覆盖之前的任务,所以我得到了两倍的结果。

我的代码:

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

获取文本():

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

    }
4

2 回答 2

2

我的意思是覆盖旧结果,最后我必须精确输入。我该如何解决这个问题?

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

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

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

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

于 2013-10-06T14:12:29.073 回答
0

这看起来像一个线程问题。我假设 App.Number 从 1 开始,而 App.Total 为 4,但我认为 App.Number <= App.Total 的任何值都会发生这种情况。

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

我认为您的问题是您需要在阅读 App.Number 后立即更新它以构建 URL(加上在阅读/递增它时保持锁定,这样您就不会遇到竞争条件)。

于 2013-10-06T14:32:17.743 回答