最初の質問を非同期されていない関数の内部で待つ: 私はが非同期としてマークされていない関数の内部待つ使うことはできますか?非同期プログラミング:
詳細はこちら。私はこの投稿を読んでいました。 Hololens- Capturing Photo...あなたが見ることができるように、著者はいくつかのコードを投稿しました。その中で この
void Start()
{
getFolderPath();
while (!haveFolderPath)
{
Debug.Log("Waiting for folder path...");
}
Debug.Log("About to call CreateAsync");
PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
Debug.Log("Called CreateAsync");
}
async void getFolderPath()
{
StorageLibrary myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;
Debug.Log("savePicturesFolder.Path is " + savePicturesFolder.Path);
folderPath = savePicturesFolder.Path;
haveFolderPath = true;
}
は今getFolderPathは(イベントハンドラなど)voidを返すが、ドキュメントはこれらのメソッドを待つことができないと言っているかに気づきます。代わりに、whileループを使用することを著者が待っています。
しかし、私はこれを行う場合
void Start()
{
await getFolderPath();
Debug.Log("About to call CreateAsync");
PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
Debug.Log("Called CreateAsync");
}
//Notice how now it returns Task
async Task getFolderPath()
{
StorageLibrary myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
//.....
}
が、私はこれを行うことができますか?
技術的には真ですが、 'ContinueWith'は低レベルの危険なAPIです。代わりに 'await'を使うことができます。 –
@StephenCleary:「低レベル」だと私は同意しますが、私は "危険な"人に頭を向けます。それはちょうど意見ですか、あるいはいくつかの根拠がありますか? –
[ここでは長い議論がある](https://blog.stephencleary.com/2015/01/a-tour-of-task-part-7-continuations.html)。要約すると、最も一般的な危険な部分は、非同期のデリゲートを理解できず、デフォルトでスレッドプールを使用しない(ほとんどの人が想定しているように)、 'CancellationToken'は実行中のデリゲートを取り消します。動的なタスクの並列処理を行う場合にのみ意味をなさない引数のデフォルト値もあります。非同期プログラミングではありません。特に、非同期プログラミングのために使用するときは常に* TaskSchedulerと* TaskContinuationOptionsを渡すべきです。 –