Thread调用SaveFileDialog

        public void ThreadSaveFileDialog(string sourceFileName)
        {
            Thread importThread = new Thread(new ParameterizedThreadStart(SaveDialog));
            importThread.SetApartmentState(ApartmentState.STA); //重点
            importThread.IsBackground = true;
            importThread.Start(sourceFileName);

        }


        public static MainForm ScratchForm;//这个是主窗口
        private void SaveDialog(object sourceFileName)
        {
            SaveDialogShow(sourceFileName as string);

        }

        delegate void SaveDialogShowCallBack(string sourceFileName);
        private void SaveDialogShow(string sourceFileName)
        {
       //判断主窗口是否跨线程调用
if (ScratchForm.InvokeRequired) { SaveDialogShowCallBack stcb = new SaveDialogShowCallBack(SaveDialogShow); ScratchForm.Invoke(stcb, new object[] { sourceFileName }); } else {
          //将saveFileDialog附加上主From上,否则的话点击主窗口会把savefiledialog给遮挡住。重复点击保存会弹出多个savefiledialog result
= ScratchForm.saveFileDialog.ShowDialog(ScratchForm); if (result == DialogResult.OK) { string destFileName = ScratchForm.saveFileDialog.FileName; Task.Run(() => { File.Copy(sourceFileName, destFileName, true); }); } } }
原文地址:https://www.cnblogs.com/xbzhu/p/9095305.html