Я только что наткнулся на объект Backgroundworker, и это похоже на инструмент, который я ищу, чтобы заставить мой GUI отвечать при выполнении вычислений. Я пишу плагины IO для ArcGIS.Threading и ArcGIS
Я занимаюсь обработкой данных вне ArcGIS, который отлично работает с помощью фонового рабочего. Но когда я вставляю данные в ArcGIS, фоновая работа, похоже, увеличивает время продолжительности в 9 раз или около того. Размещение кода обработки вне метода DoWork повышает производительность в 9 раз.
Я прочитал об этом несколько мест в сети, но у меня нет опыта в многопоточном программировании, и такие термины, как STA и MTA, ничего не значит для меня. link text Я также попытался использовать простую реализацию потоковой передачи, но с аналогичными результатами.
Кто-нибудь знает, что я могу сделать, чтобы использовать обработку ArcGIS и поддерживать гибкий графический интерфейс?
EDIT: Я включил образец моего взаимодействия с фоновым работником. Если я помещаю код в метод StartImporting в методе cmdStart_Click, он выполняется намного быстрее.
private void StartImporting(object sender, DoWorkEventArgs e)
{
DateTime BeginTime = DateTime.Now;
// Create a new report object.
SKLoggingObject loggingObject = new SKLoggingObject("log.txt");
loggingObject.Start("Testing.");
SKImport skImporter = new SKImport(loggingObject);
try
{
// Read from a text box - no writing.
skImporter.Open(txtInputFile.Text);
}
catch
{
}
SKGeometryCollection convertedCollection = null;
// Create a converter object.
GEN_SK2ArcGIS converter = new GEN_SK2ArcGIS(loggingObject);
// Convert the data.
convertedCollection = converter.Convert(skImporter.GetGeometry());
// Create a new exporter.
ArcGISExport arcgisExporter = new ArcGISExport(loggingObject);
// Open the file.
// Read from a text box - no writing.
arcgisExporter.Open(txtOutputFile.Text);
// Insert the geometry collection.
try
{
arcgisExporter.Insert(convertedCollection);
}
catch
{
}
TimeSpan totalTime = DateTime.Now - BeginTime;
lblStatus.Text = "Done...";
}
private void ChangeProgress(object sender, ProgressChangedEventArgs e)
{
// If any message was passed, display it.
if (e.UserState != null && !((string)e.UserState).Equals(""))
{
lblStatus.Text = (string)e.UserState;
}
// Update the progress bar.
pgStatus.Value = e.ProgressPercentage;
}
private void ImportDone(object sender, RunWorkerCompletedEventArgs e)
{
// If the process was cancelled, note this.
if (e.Cancelled)
{
pgStatus.Value = 0;
lblStatus.Text = "Operation was aborted by user...";
}
else
{
}
}
private void cmdStart_Click(object sender, EventArgs e)
{
// Begin importing the sk file to the geometry collection.
// Initialise worker.
bgWorker = new BackgroundWorker();
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ImportDone);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(ChangeProgress);
bgWorker.DoWork += new DoWorkEventHandler(StartImporting);
bgWorker.WorkerReportsProgress = true;
bgWorker.WorkerSupportsCancellation = true;
// Start worker.
bgWorker.RunWorkerAsync();
}
private void cmdCancel_Click(object sender, EventArgs e)
{
bgWorker.CancelAsync();
}
С наилучшими пожеланиями, Casper
Какое расширение IO вы пишете для ArcGIS? Используете ли вы геообработку, расширение каталога, расширение arcmap, ...? –
Он предназначен для использования в ArcMap в качестве кнопки, и он либо создает персональную базу геоданных, либо читает функции из базы геоданных. Отвечает ли это на ваш вопрос? Мое предприятие в ArcGIS - это процесс медленного обучения :-) – Chau