我看了一下這個錯誤很多帖子,但我不知道它如何能在我的解決方案來解決((我有一個進度對話框,在IT-一些邏輯這是從大型機通過ButtonClick稱爲調用線程不能訪問該對象
void OnBtnClick(object sender, RoutedEventArgs e)
{
ProgressDialog dlg = new ProgressDialog("");
dlg.Closing += new CancelEventHandler(dlg_Closing);
dlg.Closed += new EventHandler(dlg_Closed);
//dlg.AutoIncrementInterval = 0;
LibWrap lwrap = new LibWrap();
DoWorkEventHandler handler = delegate
{
BitmapFrame bf = wrap.engine(BitmapFrame.Create(FXPhotoStudio.App
.draggedImage),
this.fxPSEditorView);
};
dlg.CurrentLibWrap = lwrap;
dlg.AutoIncrementInterval = 100;
dlg.IsCancellingEnabled = true;
dlg.Owner = Application.Current.MainWindow;
dlg.RunWorkerThread(0, handler);
}
也有此進度條的對話框
void dlg_Closed(object sender, EventArgs e)
{
try
{
mainFrameView.CurrentImage = effectedImage;//!error here!
}
}
的effectedImage是大型機的領域在封閉的情況下同一類(大型機)的處理程序。它由我的ProgressDialog設置。 我使ProgressDialog.cs如下:
(this.Owner as MainFrame).effectedImage = currentLibVrap.GetEffectedImage;
currentLibVrap
在OnBtnClick
設置 - 見上 誰能幫我解決這個問題?
這是關閉ProgressBarDialog代碼:
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!Dispatcher.CheckAccess())
{
//run on UI thread
RunWorkerCompletedEventHandler handler = worker_RunWorkerCompleted;
Dispatcher.Invoke(DispatcherPriority.SystemIdle, handler, new object[] {sender, e}, null);
return;
}
if (e.Error != null)
{
error = e.Error;
}
else if (!e.Cancelled)
{
//assign result if there was neither exception nor cancel
(this.Owner as MainWindow).effectedImage = currentLibVrap.GetEffectedImage;//! ok there
result = e.Result;
}
//update UI in case closing the dialog takes a moment
// progressTimer.Stop();
progressBar.Value = progressBar.Maximum;
btnCancel.IsEnabled = false;
//set the dialog result, which closes the dialog
DialogResult = error == null && !e.Cancelled;
}
而且還有工作過程:
/// Launches a worker thread which is intended to perform
/// work while progress is indicated, and displays the dialog
/// modally in order to block the calling thread.
/// </summary>
/// <param name="argument">A custom object which will be
/// submitted in the <see cref="DoWorkEventArgs.Argument"/>
/// property <paramref name="workHandler"/> callback method.</param>
/// <param name="workHandler">A callback method which is
/// being invoked on a background thread in order to perform
/// the work to be performed.</param>
public bool RunWorkerThread(object argument, DoWorkEventHandler workHandler)
{
if (autoIncrementInterval.HasValue)
{
//run timer to increment progress bar
progressTimer.Interval = TimeSpan.FromMilliseconds(autoIncrementInterval.Value);
progressTimer.Start();
// LibWrap lwrap = new LibWrap();
// BitmapFrame bf = lwrap.engine(BitmapFrame.Create(FXPhotoStudio.App.draggedImage));//(aa.Image);
}
//store the UI culture
uiCulture = CultureInfo.CurrentUICulture;
//store reference to callback handler and launch worker thread
workerCallback = workHandler;
worker.RunWorkerAsync(argument);
//display modal dialog (blocks caller)
return ShowDialog() ?? false;
}
/// <summary>
/// Worker method that gets called from a worker thread.
/// Synchronously calls event listeners that may handle
/// the work load.
/// </summary>
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//make sure the UI culture is properly set on the worker thread
Thread.CurrentThread.CurrentUICulture = uiCulture;
//invoke the callback method with the designated argument
workerCallback(sender, e);
}
catch (Exception)
{
//disable cancelling and rethrow the exception
//Dispatcher.BeginInvoke(DispatcherPriority.Normal,
// (SendOrPostCallback) delegate { btnCancel.SetValue(Button.IsEnabledProperty, false); },
// null);
return;
//throw;
}
}
你需要調用`Invoke()`來在你的UI線程中調用一個函數。 – ThePower 2011-12-14 09:32:49