解决 重复调用任务,但前提是之前的任务已完成

假鼻子

会员
已加入
2019年9月19日
留言内容
10
编程经验
Beginner
嘿大家

我使用下面的代码查找抽象基类的所有子类,然后实例化每个子类并将该实例添加到列表中。

我想做的是遍历该实例列表并每秒运行一个实例,该实例是每个实例的抽象基类的一部分,但是我只想在前一个任务运行第二个时运行该任务前完成。我已经看到其他人使用Func做类似的事情<Task>但我不知道他们是如何实现的。

这是可以做的事情吗,如果可以,我应该怎么做?

先感谢您!!

C#:
public static List<ConsumableBase> Instances = new List<ConsumableBase>();
public static async void Manage()
{
    IEnumerable<Type> _classes = GetChildrenOfType(typeof(ConsumableBase));
    foreach (Type _class in _classes)
    {
        ConsumableBase _obj = (ConsumableBase) InstantiateType(_class);
        Instances.Add(_obj);
    }
}
private static IEnumerable<Type> GetChildrenOfType(Type _type)
{
    var _classes = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(s => s.GetTypes())
        .Where(p => _type.IsAssignableFrom(p));

    return _classes;
}

private static object InstantiateType(Type _type)
{
    var _ctors = _type.GetConstructors(BindingFlags.Public);
    var _inst = _ctors[0].Invoke(new object[] { });

    return _inst;
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
首先想到的是这种事情:
C#:
private 任务 currentTask;

public void StartNewTask()
{
    if (currentTask?.IsCompleted == true)
    {
        currentTask = 任务.Run(DoSomething);
    }
}

public void DoSomething()
{
    // ...
}
You can then call StartNewTask wherever and whenever you want, e.g. from the event handler for a Timer that is invoked every second.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
实际上,我只是意识到我的代码不太正确。应该是:
C#:
if (currentTask?.IsCompleted != false)
The first time around, currentTask will be null and thus currentTask?.IsCompleted will be also be null. If that expression is null or true then you want to start a new 任务.
 
最佳 底部