Я только что наткнулся на объект Backgroundworker, и это похоже на инструмент, который я ищу, чтобы заставить мой графический интерфейс реагировать при выполнении вычислений. Я пишу плагины ввода-вывода для ArcGIS.
Я выполняю некоторую обработку данных вне ArcGIS, которая отлично работает с помощью backgroundworker. Но когда я вставляю данные в ArcGIS, фоновый рабочий, похоже, увеличивает продолжительность в 9 раз или около того. Размещение кода обработки вне метода DoWork повышает производительность в 9 раз.
Я читал об этом в нескольких местах в сети, но у меня нет опыта многопоточного программирования, а такие термины, как STA и MTA, для меня ничего не значат. текст ссылки Я также пробовал использовать простую реализацию многопоточности, но с аналогичными результатами.
Кто-нибудь знает, что я могу сделать, чтобы иметь возможность использовать обработку ArcGIS и поддерживать адаптивный графический интерфейс?
РЕДАКТИРОВАТЬ: я включил образец моего взаимодействия с фоновым работником. Если я помещу код, находящийся в методе 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();
}
С уважением, Каспер