等待抽象的异步任务

压扁的

我对async/await用法非常陌生。我正在尝试await在UI中有条件地抽象异步我有一个抽象基类:

public abstract class Base
{
    public abstract bool IsRunning { get; }
    public abstract Task<bool> Run();
}

然后从中派生一些实例,第一个是同步的:

internal class Derived1 : Base
{
    private readonly Base baseCase;
    private Task<bool> task;
    public Derived1(Base baseCase)
    {
        this.baseCase = baseCase;
    }
    public override bool IsRunning
    {
        get { return false; }
    }
    public override Task<bool> Run()
    {
        task = new Task<bool>(() => 
        {
            bool ok = DoSomething();
            return ok;
        });
        return task;
    }
}

以及异步实现的派生类:

internal class Derived2 : Base
{
    private readonly Base baseCase;
    private Task<bool> task;
    public Derived2(Base baseCase)
    {
        this.baseCase = baseCase;
    }
    public override bool IsRunning
    {
        get { return task != null && task.Status == TaskStatus.Running; }
    }
    public override Task<bool> Run()
    {
        task = new Task<bool>(() => 
        {
            bool ok = DoSomething();
            return ok;
        });
        return task;
    }
}

然后在UI,我想awaitasynchronous任务(如果用户在运行时配置中指定的话),如下所示:

internal class CaseMenuHandler
{
    private async void OnRun(object sender, EventArgs args)
    {
        foreach (var case in Cases)
        {
            Base baseCaseRunner = GetCaseRunner(case);
            try
            {
                bool ok = true;
                if( something_holds ) {
                    ok = await baseCaseRunner.Run();
                }
                else {
                    ok = baseCaseRunner.Run().Result;
                }
            }
            catch (Exception e)
            {
                LogError(...);
            }
        }
    }

希望这很清楚。我可以执行上述操作,特别是在if块中有条件地等待吗?理想情况下,我想使Base类仅返回bool而不Task<bool>Run方法返回,并且仅使Derived2类重写以返回a Task<bool>,但是我不清楚如何做到这一点。也许我应该返回task.Result里面的Run方法Derived2如果有更好的方法,包括抽象或任何​​其他更正,请告诉我。欣赏任何想法。

编辑#1

在下面的响应中已经阐明Run了同步实现方法形式Derived1但是,我不允许更改DoSomething方法的签名,因此,鉴于此,(异步实现)中的我的Run方法Derived2现在如下所示(由于@Stripling的注释):

    public override async Task<bool> Run()
    {
        task = new Task<bool>(() => 
        {
            bool ok = DoSomething();
            return ok;
        });
        task.Start();
        return await task;
    }

编辑#2

当我尝试上述操作时(也尝试task.Start()task定义进行调用时,出现以下错误:

Cross-thread operation not valid: Application accessed domain object from a thread other than a legal thread.
脱衣战士

我可以执行上述操作,特别是在if块中有条件地等待吗?

可以,但不必这样做。如果您做对了,以阻塞的方式专门调用同步任务没有太大的优势:作为一般规则,您可以只await返回返回的Task,如果它代表一个同步任务,则await只需很少的时间即可同步解决该任务。高架。

当我说“如果您做正确的事”时,这是正确的方法:

// synchronous
public override Task<bool> Run()
{
    var result = DoSomething();
    return Task.FromResult(result);
}


// asynchronous
public override async Task<bool> Run()
{
    var result = await DoSomethingAsync();
    return result;
}

await上面第一个示例的结果将不会执行任何线程切换或类似的操作。await取决于的实现,可能会得出第二个结果DoSomethingAsync()不需要特别的抽象层:您可以始终检查aTask是否已完成,并且await已经完成的任务总是会立即返回一个值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

异步等待返回任务

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

任务异步并等待

来自分类Dev

不能等待异步任务

来自分类Dev

让异步等待并执行任务

来自分类Dev

等待2个异步任务

来自分类Dev

等待任务完成异步httpwebrequest

来自分类Dev

澄清等待/异步和任务

来自分类Dev

调用异步任务并等待答案

来自分类Dev

在任务中等待异步/等待

来自分类Dev

“异步任务然后等待任务”与“任务然后返回任务”

来自分类Dev

异步执行多个任务并等待它们完成

来自分类常见问题

如何使用LINQ异步等待任务列表?

来自分类Dev

如何使$ q等待多个异步任务?

来自分类Dev

使用Promise等待嵌套的异步任务

来自分类Dev

任务,异步,等待与SendRequestAsync示例的误解

来自分类Dev

异步/等待方法中的耗时任务

来自分类Dev

为wcf异步创建任务,无需等待

来自分类Dev

线程,任务,异步/等待,线程池

来自分类Dev

Angular-等待异步任务完成

来自分类Dev

使异步收集等待所有任务完成

来自分类Dev

等待异步方法中已完成的任务

来自分类Dev

任务,异步,等待与SendRequestAsync示例的误解

来自分类Dev

异步/等待方法中的耗时任务

来自分类Dev

如何使$ q等待多个异步任务?

来自分类Dev

异步任务并在C#中等待

来自分类Dev

如何等待运行异步方法的任务