gpt4 book ai didi

c# - 从 DragDrop 事件中将数据传递到线程的线程问题

转载 作者:太空狗 更新时间:2023-10-30 00:56:49 24 4
gpt4 key购买 nike

我有一个带有用于拖放文件的按钮的 C# 应用程序。我可以从我的桌面上获取 6 个文件并将其放到按钮上并让它处理这 6 个文件。

但是,当我从 DragDrop 事件启动线程并将文件路径传递到从 DragDrop 事件内启动的新线程时,一旦线程接收到 FilePath 参数,文件路径就不正确。

如果我通过将 6 个文本文件拖到我的按钮上来执行我的代码(对于这个例子我不得不从中删除很多代码),我将在我的控制台中看到以下内容:

++ 使用这些参数调用测试线程:false, TestButton,test.txt,c:\test.txt
++ 使用这些参数调用测试线程:false, TestButton,test2.txt,c:\test2.txt
++ 使用这些参数调用测试线程:false, TestButton,test3.txt,c:\test3.txt
++ 使用这些参数调用测试线程:false, TestButton,test4.txt,c:\test4.txt
++ 使用这些参数调用测试线程:false, TestButton,test5.txt,c:\test5.txt
++ 使用以下参数调用测试线程: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

如您所见,线程中的文件路径与线程启动前传递给线程的文件路径不匹配。与传递给线程的文件名相比,所有 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);
}

最佳答案

您的所有线程都共享同一个 file 变量。
如果其中一个线程仅在 UI 线程开始下一次迭代后才开始运行,它将使用 file 变量的下一个值。

你需要在循环内部声明一个单独的变量,这样每个线程都会得到自己的变量。

例如:

foreach (string dontUse in files)
{
string file = dontUse;
...
}

由于 file 变量现在在循环范围内,每次迭代都会获得一个单独的变量。

关于c# - 从 DragDrop 事件中将数据传递到线程的线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com