C# 如何在异步任务中使用拖放

C# 如何在异步任务中使用拖放,c#,winforms,asynchronous,drag-and-drop,C#,Winforms,Asynchronous,Drag And Drop,我的目标是将文件从我的应用程序拖放到网站的dropzone中 为此,我制作了以下表格: public partial class Form2 : Form { private DataObject File; public Form2(string filePath) { InitializeComponent(); File = new DataObject(); File.SetFileDropList(new St

我的目标是将文件从我的应用程序拖放到网站的dropzone中

为此,我制作了以下表格:

public partial class Form2 : Form
{
    private DataObject File;

    public Form2(string filePath)
    {
        InitializeComponent();

        File = new DataObject();
        File.SetFileDropList(new StringCollection() { filePath });

        labelFileName.Text = Path.GetFileName(filePath);
    }

    private void labelFileName_MouseDown(object sender, MouseEventArgs e)
    {
        labelFileName.DoDragDrop(File, DragDropEffects.Copy);
    }
}
如果我这样使用它,它会工作:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        
        var form2 = new Form2("C:\\testfile.txt");
        form2.ShowDialog();
    }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void buttonRunAsync_Click(object sender, EventArgs e)
    {
        await Task.Run(() => OpenForm2());
    }

    private async Task OpenForm2()
    {
        var form2 = new Form2("C:\\testfile.txt");
        form2.ShowDialog();

        // do some stuff based on dialog result
    }
}
但是,如果我在异步任务中使用它,则拖放不起作用,例如:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        
        var form2 = new Form2("C:\\testfile.txt");
        form2.ShowDialog();
    }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void buttonRunAsync_Click(object sender, EventArgs e)
    {
        await Task.Run(() => OpenForm2());
    }

    private async Task OpenForm2()
    {
        var form2 = new Form2("C:\\testfile.txt");
        form2.ShowDialog();

        // do some stuff based on dialog result
    }
}

我想这是因为它没有在UI线程中运行,但我没有找到一个好的解释,而且我也不确定这是否是问题所在。

像这样使用Invoke修复了我的问题:

private async Task OpenForm2()
{
    this.Invoke((MethodInvoker)delegate
    {
        var form2 = new Form2("C:\\testfile.txt");
        var result = form2.ShowDialog();
    });
}

为什么您认为您需要异步?当您说它不工作时,您能用什么方式描述它吗?它因异常而崩溃?Task.Run方法在后台线程上执行提供的委托。在您的情况下,这是一个问题,因为不允许在UI线程之外的任何其他线程中访问UI元素。如果您的目的是在显示form2对话框时保持主窗体的非阻塞响应,请查看问题。@LarsTech我并不特别需要异步。我需要在异步任务中显示此对话框,然后等待用户拖放并单击“确定”。@WSC拖放功能不起作用。我无法将其从我的应用程序中拖出。其他一切都很好。