C# 任务覆盖任务
我的任务是从服务器获取内容。问题是,有时一个任务会覆盖以前的任务,因此我会得到两次相同的结果 我的代码:C# 任务覆盖任务,c#,asynchronous,windows-phone-7.1,C#,Asynchronous,Windows Phone 7.1,我的任务是从服务器获取内容。问题是,有时一个任务会覆盖以前的任务,因此我会得到两次相同的结果 我的代码: Task<string> task = Server.GetText(); string result = await task; if (result == "\n") { ..... } else { string[] sarray
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++;
}
Task=Server.GetText();
字符串结果=等待任务;
如果(结果=“\n”)
{
.....
}
其他的
{
字符串[]sarray=result.Split(“|”);
App.MainList.Add(新的etc.Text(sarray[0]、sarray[1]、sarray[2]、sarray[3]、sarray[4]);
App.Number++;
}
GetText():
公共静态异步任务GetText()
{
如果(应用程序编号
我的意思是覆盖旧的结果,最后我不得不放弃输入。我如何解决这个问题
当第一个方法进入时(可能是因为用户按钮按下),您正在使用await
调用GetText()
;让我们假设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
的结果
根据这些数字的含义,您将有多种解决方案:在调用GetText()之前增加App.Number
并将数字作为参数传递,使该方法不可重入,无论对您有效。例如,如果请求的顺序有某种意义,那么最好的选择是禁用该按钮,因为并行发送的HTTP请求不能保证按启动顺序完成。例如,您的GetText(2)
可以在GetText(1)
之前轻松返回;GetText(n)
也可能因为某些错误而永远不会返回
你现在知道为什么你看到了你看到的东西,但我不能提出解决方案,因为我实际上不知道正确的行为应该是什么。这取决于你!这看起来像是线程问题。我假设App.Number从1开始,App.Total是4,但我认为这会发生在App.Number没有给我们n的任何值上我们不知道Server.GetText()
做了什么,也不知道您是如何诊断的。在我们能够帮助您之前,您需要澄清很多。我编辑了这个问题“它覆盖了旧结果”是什么意思;我仍然相信这是由于重新进入造成的(只有在您从服务器获取文本后,您才会增加App.Number,因此,用户在服务器响应之前按两次按钮将启动两个相同的查询,这两个查询都将返回,但当它们返回时,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();
}
}