私は何をすべきか、その後のBackgroundWorkerを呼び出す「作業」realResultのために、それがnullのリターンであるかどうかをチェックします。 BackGroundからのコールバックでrealResultを割り当て、NotifyPropertyChangedを呼び出します。 async onプロパティはほとんど価値がありません。私はBackGroundWorkerの構造と、進行を取り消して報告する能力が好きです。
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private string textBackGround;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public MainWindow()
{
backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
InitializeComponent();
}
public string TextBackGround
{
get
{
if (!string.IsNullOrEmpty(textBackGround)) return textBackGround;
backgroundWorker1.RunWorkerAsync();
return "working";
}
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender,
DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci(worker, e);
}
// This event handler deals with the results of the
// background operation.
private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
// Next, handle the case where the user canceled
// the operation.
// Note that due to a race condition in
// the DoWork event handler, the Cancelled
// flag may not have been set, even though
// CancelAsync was called.
textBackGround = "Cancelled";
NotifyPropertyChanged("TextBackGround");
}
else
{
// Finally, handle the case where the operation
// succeeded.
textBackGround = e.Result.ToString();
NotifyPropertyChanged("TextBackGround");
}
}
// This is the method that does the actual work. For this
// example, it computes a Fibonacci number and
// reports progress as it does its work.
string ComputeFibonacci(BackgroundWorker worker, DoWorkEventArgs e)
{
// Abort the operation if the user has canceled.
// Note that a call to CancelAsync may have set
// CancellationPending to true just after the
// last invocation of this method exits, so this
// code will not have the opportunity to set the
// DoWorkEventArgs.Cancel flag to true. This means
// that RunWorkerCompletedEventArgs.Cancelled will
// not be set to true in your RunWorkerCompleted
// event handler. This is a race condition.
if (worker.CancellationPending)
{
e.Cancel = true;
return "cancelled";
}
Thread.Sleep(1000);
if (worker.CancellationPending)
{
e.Cancel = true;
return "cancelled";
}
return "complete";
}
}
ディスパッチャから来るんしかし:
あなたが「進行中」値の
null
を使用する場合は、このような何かを行うことができますか? – user380719[DispatcherObject.Dispatcher Property](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherobject.dispatcher.aspx)からのものです。ほとんどのクラスは 'DispatcherObject'から継承されています。 – LPL
[DependencyObject Class](http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.aspx)からMyPropertyを使用してクラスを継承したり、 "Application.Current.Dispatcher"を使用したりできます。 – LPL