我对FileIO有问题。它继续错误提示“正在由另一个进程使用”。下面是它的图片。
因此,经过大量调试..我发现“ await FileIo.AppendTextAsync()”部分存在问题。下面是它的捕获。如果进行缩放,则在右下角会看到错误的try-catch。
为解决此问题,我使用信号量来确保一个进程可以访问FileIO-即使原始源也只能确保一个进程FileIO.-但这没有用。再次出错(被另一个进程使用)
下面是我的源代码。
public async Task<List<string>> DoRandom(FileLists fl, StorageFolder folder, StorageFile another_file, int k)
{
FileLists retLists = new FileLists();
List<string> encodingList = new List<string>();
if (Option1)
{
foreach (UploadedFile i in fl)
{
await i.setOutFile(folder); // wait until setOutFile ends
// read stream from storagefile
using (Stream s = await i.originFile.OpenStreamForReadAsync())
{
// streamreader from stream
using (StreamReader sr = new StreamReader(s))
{
string str = await sr.ReadToEndAsync();
StringBuilder stringBuilder = new StringBuilder(str);
string[] vs =
str.Split(new string[] { "\n", "\r\n", "\r" }, StringSplitOptions.None);
foreach (var j in vs)
{
// try
{
await FileIO.AppendTextAsync(i.outputFile, j); // <--- real Problem Point
}
//catch { }
}
}
}
}
}
DoRandom函数由下面的函数调用。
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
/** non important source is omitted **/
var picker = new Windows.Storage.Pickers.FolderPicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
picker.FileTypeFilter.Add("*");
StorageFolder folder = await picker.PickSingleFolderAsync();
if (folder != null)
{
await myRandomizer.DoRandom(uploadedFileLists, folder, another_file, k);
/*
foreach (string str in fileEncoding)
{
var messageDialog = new MessageDialog(str);
messageDialog.Title = str;
await messageDialog.ShowAsync();
}
*/
}
}
}
我真的很沮丧,因为我不明白我的消息来源有什么问题。 我只是将源代码用作字符串(在这些字符串中分割和分割)。在输出文件中,存在一些字符串(但不是所有字符串)。
并且您可以看到,在我的资源中,我有“ option1”。这意味着我也有一些选择。但其他人工作得很好。但是option1(文本文件超过20,000KB)始终会出错。我的来源有什么问题?
下面是我的课程及其setOutFile源。
class UploadedFile
{
public StorageFile originFile;
public StorageFile outputFile { get; set; }
// ....omitted
public async Task setOutFile(StorageFolder folder)
{
var rand = new Random();
string charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
StringBuilder result = new StringBuilder(13);
for (int i=0; i<13; i++)
{
result.Append(charset[rand.Next(charset.Length)]);
}
StringBuilder outputName = new StringBuilder();
outputName.Append(inputName.Substring(0, inputName.Length - 4));
outputName.Append("_");
outputName.Append(result);
outputName.Append(".txt");
this.outputName = outputName.ToString();
if (folder != null)
{
outputFile = await folder.CreateFileAsync(outputName.ToString(), CreationCollisionOption.ReplaceExisting);
}
}
答案 0 :(得分:1)
感谢您的所有评论。我认为问题是,正如您所说&visual studio通知的那样,某个进程“锁定”了FileIO。
实际上,直到我满足@Johnny Westlake的建议,我才清楚地知道我遇到了什么问题。我只是升级Visual Studio并重新启动Windows。看起来不错。
所以我想,以前的源代码(比我发布的要早)在Windows上发生了一些错误,并且在继续进行某些处理的同时结束了。
但问题似乎没有解决,这不是事实。当我将大量输入文件添加到我的应用程序时,我的应用程序再次暂停。因此,我使用了try-catch语法。
最后,我将源从“ FILEIO.AppendTextAsync”更改为“ FILEIO.WriteTextAsync”(根据Johnny Westlake的建议)。并且经过大量调试,没有停止,最终我不需要try-catch语法。
其操作时间(时间复杂度)从10〜20秒降低到不到1秒(对于大文件输入)
下面是我的源代码。
public async Task<List<string>> DoRandom(FileLists fl, StorageFolder folder, StorageFile another_file, int k)
{
FileLists retLists = new FileLists();
List<string> encodingList = new List<string>();
if (Option1)
{
foreach (UploadedFile i in fl)
{
await i.setOutFile(folder); // wait until setOutFile ends
// read stream from storagefile
using (Stream s = await i.originFile.OpenStreamForReadAsync())
{
// streamreader from stream
using (StreamReader sr = new StreamReader(s))
{
string str = await sr.ReadToEndAsync();
StringBuilder stringBuilder = new StringBuilder(str);
List<string> ans = doOption1(stringBuilder, k);
StringBuilder ret = new StringBuilder();
foreach (var j in ans)
{
ret.Append(j); //<--- append all string
}
await FileIO.WriteTextAsync(i.outputFile, ret.ToString()); // <-- write it at one time
}
}
}