我有一项从我的服务器获取内容的任务。问题是,有时任务会覆盖任务,所以我得到两次相同的结果。
我的代码:
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();
}
}
答案 0 :(得分:2)
我的意思是覆盖旧的结果,最后我必须编写条目。我该如何解决这个问题呢?
当第一种方法进入时(可能是因为按下用户按钮),您使用GetText()
来调用await
;当您第一次执行此操作时,我们假设App.Number
为1
。由于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>