Obecnie piszę prostą aplikację do kopiowania plików WPF, która kopiuje pliki równolegle. Jak na razie działa świetnie! Robi wszystko, co chcę. Mięso na działanie jest w kolejnym bloku kodu:Śledź wątki równoległe Foreach
Parallel.ForEach(Directory.GetFiles(dir).ToList(), file =>
{
_destDetail.CurrOp = string.Format("Copying file: {0}", Path.GetFileName(file));
File.Copy(file, file.Replace(_destDetail.Source, _destDetail.Dest), true);
if (_destDetail.Progress < _destDetail.MaxProgress)
_destDetail.Progress++;
});
można zaimplementować ParallelOptions
i ograniczenia maksymalnej liczby nici 4, a także, ale nie było zastanawiać, czy jest to sposób, aby dokładnie śledzić co każdy wątek robiłby w tym przypadku?
Załóżmy na przykład, że mam część mojego interfejsu użytkownika poświęconą bieżącemu "statusowi" operacji kopiowania. Chciałbym mieć 4 wiersze w Grid
, z których każdy miał określony wątek i który plik aktualnie kopiował.
wiem, że mogę używać Interlocked
manipulować zmiennych, które są na zewnątrz pętli Parallel
, ale jak będę śledzić zmienne gwintu specyficznych od wewnątrz pętli Parallel
i korzystanie z tych zmiennych, aby utrzymać UI do datę, w którym wątek działa na który plik?
Tylko FYI, 'File.Copy' jest złym pomysłem do zrobienia wewnątrz' Parallel.ForEach', powinieneś używać tylko 'Parallel.ForEach' na pracy związanej z CPU, dla pracy związanej IO jej algorytm szeregowania spróbuje zacznij zbyt wiele zadań i najprawdopodobniej potrwa to dłużej, niż gdybyś właśnie skopiował pliki w normalnej pętli foreach za pomocą pojedynczego wątku. –