我使用以下代码将文件拖放到c#winforms应用程序中。我遇到的问题是DragDrop事件处理程序需要一段时间,在此期间我无法使用拖动文件的窗口。如何解决这个问题?
private void FormMain_DragDrop(object sender, DragEventArgs e)
{
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
// do some long operation
}
private void FormMain_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.All;
else
e.Effect = DragDropEffects.None;
}
答案 0 :(得分:1)
您可以使用BackgroundWorker
在不同的主题中执行所需的操作,如下所示:
BackgroundWorker bgw;
public Form1()
{
InitializeComponent();
bgw = new BackgroundWorker();
bgw.DoWork += bgw_DoWork;
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
bgw.RunWorkerAsync(s);
}
}
同样针对您的“跨线程操作”问题,尝试使用Invoke
方法,如下所示:
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
Invoke(new Action<object>((args) =>
{
string[] files = (string[])args;
}), e.Argument);
}
最好使用上面的GetDataPresent
检查已删除的项目是否为文件。
答案 1 :(得分:0)
如果不是ui密集型操作,可以使用后台线程进行长时间运行。
ThreadPool.QueueUserWorkItem((o) => /* long running operation*/)