Indeterminate="True"
時間のかかるタスクを実行するときに、進行状況バーを含む単純な WPF ウィンドウを表示したいと思います。
私は、Reed Copsey によるこの例に従ってソリューションを実装しました。
プロセスが完了したら、ウィンドウを閉じる必要があります。私の推測では、これを達成するには、スレッドを強制終了するか、ビュー (ウィンドウ) を閉じる必要があります。
残念ながら、どちらの方法でも次のエラーが発生します。
Abort()
1)スレッドの呼び出し:
ウィンドウは閉じていますが、これは正しいのですが、まだ次のエラーが表示されます。
コードが最適化されているか、ネイティブ フレームがコール スタックの最上位にあるため、式を評価できません
2) View.Close()
:
別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。
必要なロジックをStopThread()
メソッドに実装する必要があります。ウィンドウをエレガントに閉じるために何ができるか考えてみてください。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using Microsoft.Practices.Composite.Presentation.Commands;
namespace ProgressBar
{
public class ProgressBarViewModel
{
public DelegateCommand<object> CloseCommand { get; set; }
Thread newWindowThread;
string _closeButton;
public string CloseButton
{
get { return _closeButton; }
set { _closeButton = value; }
}
ProgressBarView _view;
public ProgressBarView View
{
get { return _view; }
set { _view = value; }
}
public ProgressBarViewModel(ProgressBarView view)
{
CloseButton = "Close";
CloseCommand = new DelegateCommand<object>(CloseForm);
View = view;
View.Closing +=new System.ComponentModel.CancelEventHandler(View_Closing);
View.DataContext = this;
}
public void View_Closing(object sender,CancelEventArgs e)
{
StopThread();
}
public void CloseForm(object p)
{
StopThread();
}
private void StopThread()
{
try
{
//View.Close();
newWindowThread.Abort();
}
catch (Exception eX)
{
Debugger.Break();
//Getting an error when attempting to end the thread:
//Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack
}
}
public void ShowProgress()
{
newWindowThread = new Thread(new ThreadStart(() =>
{
ProgressBarView tempWindow = new ProgressBarView();
tempWindow.DataContext = this;
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
}
}