C# Windows 8 Metro应用程序仅在文件被读取时在调试器中启动
我正在用XNA和Monogame编写一个Windows8Metro应用程序。 我正在使用此代码读取文件: 文件读取: 我用以下方法调用该方法:C# Windows 8 Metro应用程序仅在文件被读取时在调试器中启动,c#,windows-8,xna,async-await,C#,Windows 8,Xna,Async Await,我正在用XNA和Monogame编写一个Windows8Metro应用程序。 我正在使用此代码读取文件: 文件读取: 我用以下方法调用该方法: XDocument gameinfo = null; try { getDoc("gameinfo.xml"); while (readstate == 0) { } gameinfo = doc; }
XDocument gameinfo = null;
try
{
getDoc("gameinfo.xml");
while (readstate == 0) { }
gameinfo = doc;
}
catch { gameinfo = null; }
问题是:
如果我调试应用程序,一切正常。
如果我释放应用程序,然后直接从Win8启动屏幕启动,则应用程序不会启动。
我发现
while (readstate == 0) { }
readstate在release状态下永远不会得到与0不同的值。但我不知道为什么
我对每个答案都很满意。
谢谢大家!
谢谢你的快速回答,纳赫尔! 我重写了代码,但仍然不适用于我,行为与以前一样
private async Task<int> getDoc(String filename)
{
try
{
// get the file
StorageFile myStorageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
var readThis = await FileIO.ReadLinesAsync(myStorageFile);
String txt = "";
foreach (var line in readThis)
{
txt += line.ToString();
}
if (txt.Length > 0)
{
doc = XDocument.Parse(txt);
}
return 1;
}
catch (FileNotFoundException ex)
{
doc = null;
return 2;
}
}
private异步任务getDoc(字符串文件名)
{
尝试
{
//获取文件
StorageFile myStorageFile=wait ApplicationData.Current.LocalFolder.GetFileAsync(文件名);
var readThis=await FileIO.ReadLinesAsync(myStorageFile);
字符串txt=“”;
foreach(readThis中的var行)
{
txt+=line.ToString();
}
如果(txt.Length>0)
{
doc=XDocument.Parse(txt);
}
返回1;
}
捕获(FileNotFoundException ex)
{
doc=null;
返回2;
}
}
装载时:
XDocument gameinfo = null;
try
{
Task<int> tsk = getDoc("gameinfo.xml");
int result = tsk.Result;
if (result == 1)
{
gameinfo = doc;
}
else
{
gameinfo = null;
}
}
catch { gameinfo = null; }
XDocument gameinfo=null;
尝试
{
Task tsk=getDoc(“gameinfo.xml”);
int result=tsk.result;
如果(结果==1)
{
gameinfo=doc;
}
其他的
{
gameinfo=null;
}
}
catch{gameinfo=null;}
您使用的方法具有一些async
操作,但没有将其标记为async
将getDoc
方法标记为async
,并在调用它的地方等待它
不要使用readstate变量,而是从getDoc
方法返回int
,并在主调用中使用该对象。或者更好的是,返回您想要使用的文档
下面是异步/等待调用如何工作的图片:
如果在方法中有一个wait,那么一旦代码到达它;它将返回给它的调用者。在那之后有一个无限循环对你没有帮助
更新:
根据您的新答案,您缺少getDoc
呼叫中的wait
替换:
Task<int> tsk = getDoc("gameinfo.xml");
Task tsk=getDoc(“gameinfo.xml”);
与:
Task tsk=wait getDoc(“gameinfo.xml”);
无法使用:
Task<int> tsk = await getDoc("gameinfo.xml");
到
根据您的新代码段更新了我的答案。
Task<int> tsk = await getDoc("gameinfo.xml");
Task<int> tsk = await getDoc("gameinfo.xml");
while (readstate == 0) { }
while (readstate == 0) {
System.Threading.Tasks.Task.Yield();
}