Если несколько потоков пытаются получить доступ (одновременно) к файлу на txtdestino.Text
- разве это не обречено с самого начала? Возможно, вы захотите прочитать содержимое в память сначала и записать оттуда ...
Точно так же вы собираетесь забить IO; Интересно, может ли более практичный ответ (который решает проблему выше и ниже) просто скопировать последовательно на работника.
Похоже, что вы действительно возвращаете всю работу обратно в поток пользовательского интерфейса в любом случае ...? конечно, вы должны сделать что-то вроде:
string path = txtdestino.Text;
Thread t = new Thread(new ThreadStart(delegate() {
foreach (FileInfo Fi in _FileInfoArray) {
File.Copy(path, Fi.FullName, true);
}
}));
t.Start();
, который:
- позволяет избежать проблемы foreach / capture (
Fi
не фиксируется)
- читает путь из потока пользовательского интерфейса и использует его (захваченный) на рабочем
- обрабатывайте каждый файл последовательно, чтобы избежать ввода-вывода
У вас также есть проблема foreach / capture; измените его на:
foreach (FileInfo tmp in _FileInfoArray)
{
FileInfo Fi = tmp;
...
Проблема в том, что, скорее всего, все потоки пытаются получить доступ к файлу last . Нет, правда. Это потому, что технически foreach
объявляет переменную (tmp
выше) вне цикла; и правила захвата переменных (используемые lambdas / anon-методами) говорят, что, следовательно, это то же самое переменная (важно: lambdas / anon-методы являются полными лексическими замыканиями, и захватывает переменную * 1045) *, а не значение ).
Повторное объявление переменной внутри цикл изменяет область, и теперь lambda / anon-метод обрабатывает переменную как другую для каждой итерации цикла.
Если вы действительно хотите, я мог бы записать это во что-то, что показывает задействованные базовые объекты, но это зависит от того, хотите ли вы этого уровня детализации; p