タスクと非同期/待機中のキーワードと混同されています。私はあなたが非同期とブロックコードを混ぜるべきではないことを理解します。または、少なくともそれらを混合する私の解釈は、次のとおりです。await/asyncタスクが待機していません
非同期メソッドからブロッキングAPIを呼び出さないでください。だからここに私の問題です。
私はメソッドを待つことを試みており、それに従ってUIを更新しています。問題は、非同期のmethod()呼び出しを待つ唯一の方法がwithinとasync method()からのものであることです。
はここに例を示します
private RelayCommand<Options> _executeCommand;
public RelayCommand<Options> ExecuteCommand
{
get
{
return _executeCommand ?? (_executeCommand = new RelayCommand<Options>(async (options) =>
{
Completed = false;
var cancellationTokenSource = new CancellationTokenSource();
await RunValidation(options, cancellationTokenSource.Token);
Completed = true;
}));
}
}
このコードは正しくメソッドを実行してお待ちしています。問題は私が帰ったときです。何らかの理由でCompleteフラグを設定するとき、このフラグに依存するボタンはトグルされません。待っているコードにコメントすると、ボタンが正しく切り替わります。だから私は、UIスレッド上で戻っていなかったと仮定ので、私が代わりにこのコードを使用してみました:ここ
private RelayCommand<Options> _executeCommand;
public RelayCommand<Options> ExecuteCommand
{
get
{
return _executeCommand ?? (_executeCommand = new RelayCommand<Options>(async (options) =>
{
Completed = false;
var cancellationTokenSource = new CancellationTokenSource();
var context = TaskScheduler.FromCurrentSynchronizationContext();
await RunValidation(options, cancellationTokenSource.Token).ContinueWith(t => Completed = true, context);
//Completed = true;
}));
}
}
はRunValidation()メソッドです:
private async Task RunValidation(Options options, CancellationToken token)
{
await _someService.SomAsyncMethod(options, token));
}
あなたが気付いた場合、ExecuteCommandは非同期を持っていますコマンドに渡される(オプション)パラメータの前にキーワードを入力します。非同期キーワードを削除すると、RunValidation()メソッドの呼び出しを変更する必要があります。私はまだそれを待つ必要があるので、これは私がやったことです:
private RelayCommand<Options> _executeCommand;
public RelayCommand<Options> ExecuteCommand
{
get
{
return _executeCommand ?? (_executeCommand = new RelayCommand<Options>((options) =>
{
Completed = false;
var context = TaskScheduler.FromCurrentSynchronizationContext();
var cancellationTokenSource = new CancellationTokenSource();
Task.Run(async() => await RunValidation(options, cancellationTokenSource.Token));
Completed = true;
}));
}
}
このコードの問題は、それが待っていないということです。だから私は迷っている。
誰でも私のためにこれにいくつかの光を当ててください。私はこれに2プラスの日を費やして、私はまだここにいる。ここで
おかげで、 ティム
は、コマンドボタンにバインドされています。
private readonly Independent<bool> _completed = new Independent<bool>(true);
public bool Completed
{
get { return _completed; }
set { _completed.Value = value; }
}
private ICommand _doneCommand;
public ICommand DoneCommand
{
get
{
return _doneCommand ?? (_doneCommand = MakeCommand.When(() => Completed).Do(() =>
{
DoSomething();
}));
}
}
private ICommand _cancelCommand;
public ICommand CancelCommand
{
get
{
return _cancelCommand ??
(_cancelCommand = MakeCommand.When(() => !Completed).Do(() => DoSomthingElse()));
}
}
私はマイケル・ペリーからUpdateControlsライブラリからMakeCommandオブジェクトを使用しています。これらには、Completeプロパティが変更されたときにCanExecuteChangeイベントを発生させる依存追跡が含まれています。
最初のコードブロックは正しいです。ボタンはCompletedフラグにどのようにバインドされていますか?それは観察可能ですか? – Jason
あなたの問題は通知が失われていることが原因で、あなたの通知が必要なライブラリを使用しているので、UpdateControlsライブラリで問題を提起することをお勧めします。 –
私は狂っていないし、物事の外観から、私はものを正しくやっている? – user953710