У меня есть приложение C # с кнопкой для перетаскивания файлов. Я могу взять 6 файлов со своего рабочего стола и перетащить их на кнопку, чтобы они обрабатывали эти 6 файлов
Однако, когда я запускаю поток из события DragDrop и передаю путь к файлу новому потоку, запущенному из события DragDrop, путь к файлу становится неправильным, когда поток получает параметр FilePath.
Если я выполню свой код, перетащив 6 текстовых файлов на свою кнопку (для этого примера мне пришлось удалить из нее много кода), я увижу в консоли следующее:
++ Вызов testthread со следующими параметрами: false, TestButton, test.txt, c: \ test.txt
++ Вызов testthread со следующими параметрами: false, TestButton, test2.txt, c: \ test2.txt
++ Вызов testthread со следующими параметрами: false, TestButton, test3.txt, c: \ test3.txt
++ Вызов testthread со следующими параметрами: false, TestButton, test4.txt, c: \ test4.txt
++ Вызов testthread со следующими параметрами: false, TestButton, test5.txt, c: \ test5.txt
++ Вызов testthread со следующими параметрами: false, TestButton, test6.txt, c: \ test6.txt
Вышеуказанный вывод правильный
Следующий вывод неверен, обратите внимание, что FilePath не совпадает с CleanFileName, как это происходит в приведенном выше выводе консоли.
++ Поток testthread - CallingfromPendingUploads == false ButtonName == TestButton CleanFileName == test.txt FilePath = c: \ test2.txt
++ Поток testthread - CallingfromPendingUploads == false ButtonName == TestButton CleanFileName == test1.txt FilePath = c: \ test3.txt
++ Поток testthread - CallingfromPendingUploads == false ButtonName == TestButton CleanFileName == test3.txt FilePath = c: \ test4.txt
++ Поток testthread - CallingfromPendingUploads == false ButtonName == TestButton CleanFileName == test4.txt FilePath = c: \ test5.txt
++ Поток testthread - CallingfromPendingUploads == false ButtonName == TestButton CleanFileName == test5.txt FilePath = c: \ test5.txt
++ Поток testthread - CallingfromPendingUploads == false ButtonName == TestButton CleanFileName == test6.txt FilePath = c: \ test5.txt
Как видите, FilePath из потока не совпадает с FilePath, который передается в поток перед его запуском. Все FilePaths отключены по сравнению с именем файла, которое передается в поток. И некоторые из FilePaths являются дубликатами, такими как text5.txt.
Я боролся с этим часами. Может кто-нибудь сказать, пожалуйста, что я делаю не так?
private void btnClick_DragDrop(object sender, DragEventArgs e)
{
string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
string ButtonName = "TestButton"
string[] files = new string[10];
files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
FileInfo fileInfo = new FileInfo(file);
Console.WriteLine("++ Filename: " + fileInfo.Name + " Date of file: " + fileInfo.CreationTime + " Type of file: " + fileInfo.Extension + " Size of file: " + fileInfo.Length.ToString());
string CleanFileName = System.Web.HttpUtility.UrlEncode(fileInfo.Name.ToString());
//Start thread
try
{
Console.WriteLine("++ Calling testthread with these params: false, " + ButtonName + "," + CleanFileName + "," + file);
new Thread(() => testthread(false, ButtonName, CleanFileName, file)).Start();
Console.WriteLine("++ testthead thread started @ " + DateTime.Now);
}
catch (Exception ipwse)
{
logger.Debug(ipwse.Message + " " + ipwse.StackTrace);
}
}
}
public void testthread(bool CalledfromPendingUploads, string ButtonName, string CleanFileName, string FilePath)
{
Console.WriteLine("++ testthread Thread - CallingfromPendingUploads == " + CalledfromPendingUploads.ToString() + " ButtonName == " + ButtonName + " CleanFileName == " + CleanFileName + " FilePath = " + FilePath);
}