У меня проблема с 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();
}
*/
}
}
}
Я действительно расстроен, потому что не могу понять, что не так с моим источником.
Я только что сделал источник для работы со строкой (split и foreach в этой строке). В выходном файле некоторые строки существуют (но не все строки).
и, как вы можете видеть, в моем источнике у меня есть "option1". это означает, что у меня есть несколько вариантов тоже. но другие работают хорошо. но option1 (с более чем 20 000 КБ текстовым файлом) всегда делает ошибку. что не так с моим источником?
ниже - мой класс и его источник 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);
}
}