【发布时间】:2014-11-24 21:22:15
【问题描述】:
这是 windows phone 8.1 silverlight 应用程序。 我有一个文件关联。为此,我有一门课
class AssociationUriMapper : UriMapperBase
{
public override Uri MapUri(Uri uri)
{
//here I'm getting file ID etc..
}
// here I want to read the file content & determine the file type because,
// the case is, even same file extension can contain different type of data
switch (fileType)
{
//here I'm calling appropriate page according to type
}
}
现在的问题是 MapUri 是被覆盖的方法,所以它必须有一个返回类型。而 OpenStreamForReadAsync() 是一个异步方法。我尝试了 Wait() 方法,创建新任务然后在其中调用 Start()、Wait() 但没有成功。目前我的代码是,
class AssociationUriMapper : UriMapperBase
{
string strData = "";
public override Uri MapUri(Uri uri)
{
strUri = uri.ToString();
// File association launch
if (strUri.Contains("/FileTypeAssociation"))
{
// Get the file ID (after "fileToken=").
int nFileIDIndex = strUri.IndexOf("fileToken=") + 10;
string strFileID = strUri.Substring(nFileIDIndex);
string strFileName = SharedStorageAccessManager.GetSharedFileName(strFileID);
string strIncomingFileType = Path.GetExtension(strFileName);
fnCopyToLocalFolderAndReadContents(strFileID);
switch (fileType)
{
case ".gmm":
//determine if gmm is text
if (objGMM.fnGetGMMType() == GMMFILETYPE.TXT)
{
return new Uri("/PageReadText.xaml?data=" + strData, UriKind.Relative);
}
break;
}
}
}
async void fnCopyToLocalFolderAndReadContents(string strIncomingFileId)
{
StorageFolder objLocalFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
objFile = await SharedStorageAccessManager.CopySharedFileAsync(objLocalFolder, TEMP.gmm, NameCollisionOption.ReplaceExisting, strIncomingFileId);
using (StreamReader streamReader = new StreamReader(objFile))
{
strData = streamReader.ReadToEnd();
}
}
}
【问题讨论】:
-
你说的“没有成功”是什么意思?当你这样做时会发生什么?
-
这里没有足够的上下文来了解正确的解决方案是什么。您可以更改
fnCopyToLocalFolderAndReadContents(),使其返回类型为Task而不是void。然后你可以在同步的MapUri()方法中调用Wait()。但这确实是一种次优方法......如果您有异步代码,您应该尝试安排实际利用它。但鉴于您正在覆盖虚拟方法,这将很困难。如果没有更多上下文,很难看出更好的解决方案是什么样的。 -
也用
ReadToEndAsync,ReadToEnd是一个阻塞调用。 -
@NedStoyanov 如果他将其标记为
async,他必须返回void、Task或Task<T> -
@YuvalItzchakov:
strData保持为空。有时应用程序会陷入僵局。 @PeterDuniho:试过 Wait().. 没用。
标签: c# silverlight async-await windows-phone-8.1