Silverlight 4(Monoのポート)にNugetパッケージSystem.Threading.Tasksを使用しています。次のために:TaskCompletionSource <DeploymentCatalog>の何が問題になっていますか?
var tasks = new Task<DeploymentCatalog>[2];
//Catalog the XAP downloaded by the Application Loader, the BiggestBox Index:
var uri0 = new Uri(Application.Current.
Host.InitParams["LoaderInfoXapPath"], UriKind.Relative);
tasks[0] = CompositionUtility.DownloadCatalogAsync(uri0);
//Catalog the XAP with the BiggestBox Index Part:
var uri1 = new Uri(Application.Current
.Host.InitParams["BiggestBoxIndexXapPath"], UriKind.Relative);
tasks[1] = CompositionUtility.DownloadCatalogAsync(uri1);
//tasks did not run by default...
//tasks[0].Start();
//tasks[1].Start();
Task.WaitAll(tasks);
this.AddToAggregateCatalog(tasks[0].Result);
this.AddToAggregateCatalog(tasks[1].Result);
base.Compose();
DownloadCatalogAsync
がある
:
/// <summary>
/// Downloads the catalog
/// in a <see cref="System.Threading.Task"/>.
/// </summary>
/// <param name="location">The location.</param>
/// <param name="downloadCompleteAction">The download complete action.</param>
[SuppressMessage("Microsoft.Reliability", "CA2000:DisposeObjectsBeforeLosingScope",
Justification = "Reliable disposal depends on callers.")]
public static Task<DeploymentCatalog> DownloadCatalogAsync(Uri location)
{
return DownloadCatalogAsTask(location, null);
}
/// <summary>
/// Downloads the catalog
/// in a <see cref="System.Threading.Task"/>.
/// </summary>
/// <param name="location">The location.</param>
/// <param name="downloadCompleteAction">The download complete action.</param>
/// <remarks>
/// For details, see the “Converting an Event-Based Pattern” section in
/// “Simplify Asynchronous Programming with Tasks”
/// by Igor Ostrovsky
/// [http://msdn.microsoft.com/en-us/magazine/ff959203.aspx]
/// </remarks>
[SuppressMessage("Microsoft.Reliability", "CA2000:DisposeObjectsBeforeLosingScope",
Justification = "Reliable disposal depends on callers.")]
public static Task<DeploymentCatalog> DownloadCatalogAsync(Uri location,
Action<object, AsyncCompletedEventArgs> downloadCompleteAction)
{
var completionSource = new TaskCompletionSource<DeploymentCatalog>();
var catalog = new DeploymentCatalog(location);
catalog.DownloadCompleted += (s, args) =>
{
if(args.Error != null) completionSource.SetException(args.Error);
else if(args.Cancelled) completionSource.SetCanceled();
else
{
completionSource.SetResult(s as DeploymentCatalog); //exception thrown here
if(downloadCompleteAction != null)
downloadCompleteAction.Invoke(s, args);
}
};
catalog.DownloadAsync();
return completionSource.Task;
}
:私は(「RanToCompletion、フォルト発生、またはキャンセル。根底にあるタスクは3つの最終状態のいずれかに既に存在する」)
InvalidOperationException
を得続けます
私はWebClient
と同じパターンを使用していますが、これはうまくいきます(しかし、私はStart()
タスクを明示的にする必要はありません)。しかし、私はWebClient
をモノポートのバージョンのタスクパラレルライブラリ(Silverlight用)でテストしませんでした。私はそれをする必要があります...
私はこれらの新しい4.5の慣例を心に留めていきます。私はTPLのMonoポートでSilverlight 4を使用していることに言及しませんでした。残念ながら、私は 'Start()'を明示的に呼び出さなければいけません。さもなければ、タスクは 'WaitingForActivation'を返します---この予期しない動作はこのモノと関係しますか? – rasx
@rasx Startを呼び出す必要はありません。タスクを返すメソッドの中でタスクを開始することを確認してください。タスクを開始する必要はありません。動作が進むにつれて、それはSilverlight + Mono TPLライブラリで取らなければならなかったアプローチのためです。 .NET 4 TPLでは、単にTask.Factory.StartNewを使用する可能性が高くなります。 –