Вторая задача не завершается, хотя условие параметра цикла обновляется в отдельной задаче.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Вторая задача не завершается, хотя условие параметра цикла обновляется в отдельной задаче.

Сообщение Anonymous »

Код: Выделить всё

public static Dictionary readAllFilesAtRootFolder(string rootFolder, string[] extensions, bool subFolders,
ConcurrentQueue fileQueue, CancellationToken cancellationToken)
{
var allFiles = new Dictionary();
IEnumerable files;
try
{
if (subFolders)
{
files = extensions.SelectMany(ext => System.IO.Directory.GetFiles(rootFolder, ext, SearchOption.AllDirectories));
}
else
{
files = extensions.SelectMany(ext => System.IO.Directory.GetFiles(rootFolder, ext, SearchOption.TopDirectoryOnly));
}
int i = 1;
foreach (var file in files)
{
if (cancellationToken.IsCancellationRequested)
break;

mediaFile mediaFile = new mediaFile();
string extension = Path.GetExtension(file).Replace(".", "").ToUpper();
// If the extension is not empty, group the files by extension
if (!string.IsNullOrEmpty(extension))
{
if (!allFiles.ContainsKey(extension))
{
allFiles[extension] = new List();
}
mediaFile.fileName = file;
//mediaFile.exif_date = getImageExifDate(file.ToString());
fileQueue.Enqueue(mediaFile);
allFiles[extension].Add(mediaFile);
}
}
return allFiles;
}
catch { }
return allFiles;
}

public static void readAllEXIFdates(ConcurrentQueue fileQueue,  ConcurrentDictionary resultDictionary,  CancellationToken cancellationToken, bool producerCompleted)
{
var allEXIFFiles = new Dictionary();

{
//Provide some free time for the main thread
//Thread.Sleep(100);
while (!cancellationToken.IsCancellationRequested && (!producerCompleted || !fileQueue.IsEmpty))
{
if (fileQueue.TryDequeue(out var mediaFile))
{
// Process EXIF date
mediaFile.exif_date = getImageExifDate(mediaFile.fileName);
var extension = Path.GetExtension(mediaFile.fileName).ToUpperInvariant().TrimStart('.');

if (!string.IsNullOrEmpty(extension))
{
resultDictionary.AddOrUpdate(extension,
new List { mediaFile },
(key, existingList) =>
{
existingList.Add(mediaFile);
return existingList;
});
}
}
else
{
// Thread.Sleep(100);
// Wait briefly if no files are available in the queue
}
}
}
}
Нажатие кнопки

Код: Выделить всё

private async void button4_Click_1(object sender, EventArgs e)
{
string[] extenions = getSelectExtensions(chkExtensions);

label5.Text = "Raading files, please wait....";

_cancellationTokenSource = new CancellationTokenSource();

string[] extensions = getSelectExtensions(chkExtensions);

label5.Text = "Reading files, please wait...";

// Define shared resources
var fileQueue = new ConcurrentQueue();
var resultDictionary = new ConcurrentDictionary();

bool producerCompleted = false;
// Producer Task
var producerTask = Task.Run(() =>
{
try
{
readAllFilesAtRootFolder("H:/My Photos/IMages/2015 - Dhaham's Choir Concert", extensions, chkSubFolders.Checked, fileQueue, _cancellationTokenSource.Token);
}
finally
{
producerCompleted = true;
}
});

var consumerTask = Task.Run(() =>  readAllEXIFdates(fileQueue, resultDictionary, _cancellationTokenSource.Token, producerCompleted));
// Wait for both tasks to complete
await Task.WhenAll(producerTask, consumerTask);

label8.Text = $"Total files processed: {resultDictionary.Values.Count}";

}
readAllEXIFdates() должен завершиться, когда для параметра ProducerCompleted установлено значение true, но цикл readAllEXIFdates() никогда не видит обновления, даже ProducerCompleted обновляется как открытый параметр класса. Почему это?

Код: Выделить всё

while (!cancellationToken.IsCancellationRequested && (!producerCompleted || !fileQueue.IsEmpty))
Это цикл while, который не завершается, поскольку ProducerCompleted никогда не обновляется.

Подробнее здесь: https://stackoverflow.com/questions/793 ... in-separat
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»