すべて、私は.NET4.5の下でasync
/キーワードを使用して引き受ける高価なタスクを持っています。クラスawait
を介してバックグラウンドスレッドから進捗状況を報告します。Progress<T>
IProgress<T>
タイプとして渡すオブジェクトProgressInfo
は、実行中にこのタイプのオブジェクトを何度も作成および破棄するオーバーヘッドを回避するために、シングルトンクラスとして作成するオブジェクトです。クラスは
public class ProgressInfo : IDisposable
{
public static ProgressInfo instance = null;
public WorkbookProgressInfo workbookinfo { get; set; }
public string progressMessage { get; set; }
public int progressPercentage { get; set; }
// Default constructor which has a few overloads
// for the class members above.
protected ProgressInfo()
{
}
...
// The default instance creator for the class.
// This also has overloads to allow changes to the
// class variables.
public static ProgressInfo Instance()
{
if (instance == null)
instance = new ProgressInfo();
return instance;
}
...
}
ReportProgress
メソッドを介して進捗状況を報告しIProgress<ProgressInfo>
、
IProgress<CostEngine.ProgressInfo> progressIndicator =
new Progress<CostEngine.ProgressInfo>(ReportProgress);
バックグラウンドスレッドからのレポートは、通常、グローバルProgressInfo progressInfo
およびグローバルIProgress<ProgressInfo> progressIndicator
のようなものを使用して行われます。
...
progressInfo = new ProgressInfo.Instance(workbookinfo, message, n);
progressIndicator.Report(progressInfo);
...
問題は、実行が小さく、実行時にオブジェクトが変更にProgressInfo
渡されるのが速いため、テストすることです。ReportProgress
ReportProgress
if (progressInfo.workbookinfo != null)
{
// Do stuff <- here progressInfo.workbookinfo is changing to null!
}
進捗状況を報告する費用を最小限に抑えながら、この問題を回避するにはどうすればよいですか?
御時間ありがとうございます。