-2

我使用以下代码将文件拖放到 ac# 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;
}
4

2 回答 2

1

您可以使用 aBackgroundWorker在不同的线程中执行您需要的操作,如下所示:

    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上述方法的文件。

于 2013-05-04T11:34:55.993 回答
0

如果它不是 ui 密集型的,您可以为这个长时间运行的操作使用后台线程。

ThreadPool.QueueUserWorkItem((o) => /* long running operation*/)
于 2013-05-04T10:31:21.970 回答