Передать задачу в свойство задачи - PullRequest
1 голос
/ 28 мая 2020

Итак, у меня есть задача, которая берет путь и открывает файл.

private async Task OpenFileAsync(string strFilePath)
{
     doTheOpenThing.
}

До сих пор это была функция void, и все было в порядке, но мы знаем, что нам нужно поддерживать большие файлы, и мы хотели чтобы открыть файл с помощью другого потока, чтобы не блокировать поток пользовательского интерфейса.

Я использую reactiveui в своем приложении, и у меня есть метод, который прослушивает задачи и запускает их по мере их поступления.

        _sessionContext.WhenAnyValue(t => t.NotifyNewTreadTask).Where(t => t != null).Subscribe(t => DoAsyncTask(t));

Где

   private async void DoAsyncTask(Task task)
        {
            if (task != null)
            {
                await DoThreadAction(() => task);
            }

            _sessionContext.NotifyNewTreadTask = null;
        }

А DoThreadAction просто запускает задачу

await Task.Run(async () => await action.Invoke());

Теперь моя проблема заключается в назначении NotifyNewTreadTask .

Когда бы я ни делал NotifyNewTreadTask = OpenFileAsync(path);

Он просто запускает задачу OpenFileAsyn c. Как передать задачу OpenFileASyn c в NotifyNewTreadTask без ее запуска.

Task? NotifyNewTreadTask { get; set; } NotifyNewTreadTask is a property.

1 Ответ

2 голосов
/ 28 мая 2020

Вы должны использовать команду для асинхронного выполнения OpenFileAsync вместо того, чтобы вызывать ее в методе Subscribe:

 public class ViewModel
 {
    public ViewModel()
    {
        OpenFile = ReactiveCommand.CreateFromTask<string>(OpenFileAsync);
    }

    public ReactiveCommand<string, Unit> OpenFile { get; }

    private async Task OpenFileAsync(string strFilePath)
    {
        //...
    }
}

Вместо того, чтобы устанавливать какое-либо свойство, вы можете выполнить задачу then напрямую и дождаться ее :

await OpenFile.Execute("file.txt");

Конечно, вы также можете вызвать его в результате установки некоторого свойства:

this.WhenAnyValue(x => x.SomeStringProperty).InvokeCommand(OpenFile);

Установка свойства Task на Task, чтобы вызвать другое Task выполнение кажется немного неуклюжим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...