private void screenShot() { if (!Directory.Exists(dstPath + @"\截图")) { Directory.CreateDirectory(dstPath + @"\截图"); } mg.setFields(@"D:\三个区\无标题.mxd", shpPathText.Text, dstPath + @"\截图", labelItems, 15, ref axMapControl1); mg.outPut(); return; }
private void button1_Click(object sender, EventArgs e) { // for (int i = 0; i < checkedListBox1.Items.Count; ++i) { if (checkedListBox1.GetItemChecked(i)) { labelItems.Add(checkedListBox1.Items[i].ToString()); } } //Thread fThread = new Thread(new ThreadStart(SleepT)); //fThread.Start(); //Thread workThread = new Thread(new ParameterizedThreadStart(WorkProc)); //workThread.Start(mg); //Thread pThread = new Thread(new ParameterizedThreadStart(progressTest)); //pThread.Start(mg); /* * 2019年3月8日11时,多线程显示进度条功能,残念。。。 * 因为ArcObjects都被标记为STA,即单线程套间,每个STAs受限于一个线程,但是COM对于每个进程内的STA没有限制. * 但一个方法调用进入一个STA时,该方法被迁移至STA中唯一的线程中,因此,一个STA中的对象一次将只能接受和处理 * 一个方法调用,它接受的每个方法调用都将会到达同一个线程中。(摘自Arcgis官网) * * 因此,尽管我新建了子线程,但仍然需要等待父线程结束执行截图方法后,才会执行进度条任务。且委托方法不能进行引用。 * * 学习到了委托、匿名方法、lambda方法、泛型委托Fun<>,子线程中创建控件时,使用beginInvoke方法将该控件归到父线程中. * CheckForIllegalCrossThreadCalls=false 方法可以修改子线程中的空间。 * 限于自己目前知识有限,对于多线程编程还是不够了解,就留在这里吧,以后有机会再处理。不过应该是没机会了。。。 */ mg.setFields(textBox2.Text, textBox3.Text, textBox9.Text, labelItems, Convert.ToInt16(textBox8.Text), ref axMapControl1, Convert.ToInt16(textBox5.Text), Convert.ToInt16(textBox6.Text)); mg.outPut(); MessageBox.Show("完成截图!"); }