如何在重复任务之前等待任务完成

本文关键字:任务 等待 | 更新日期: 2023-09-27 18:11:35

如何在重复任务之前等待任务完成

List<ushort> IdsInProgress = new List<ushort>();
public async Task<string> RunMyTask(ushort Id)
{
    if (IdsInProgress.Contains(Id))
    {
        //Here Wait previous task to finish
        //and then re-run it
        return await MyTask(Id);
    }
    return await MyTask(Id);
}
public Task<string> MyTask(ushort Id)
{
    IdsInProgress.Add(Id);
    String MyString;
    //do something
    IdsInProgress.Remove(Id);
    return Task.FromResult(MyString);
}

如何在重复任务之前等待任务完成

在dasblinkenlight对线程安全和同步发表评论后,我最终得到了这个解决方案。不确定这是否是最好的方式。

我删除了IdsInProgress,因为我不再需要它了。

private readonly object obj = new object();
public Task<string> MyTask(ushort Id)
{
    lock(obj)
    {
        String MyString;
        //do something
        return Task.FromResult(MyString);
    }
}

现在,如果我运行这个方法100次,它们就会一个接一个地运行。

根据luaan的评论,最好像这样做

private SemaphoreSlim semaphore = new new SemaphoreSlim(1);
public Task<string> MyTask(ushort Id)
{
    semaphore.Wait();
    String MyString;
    //do something
    semaphore.Release();
    return Task.FromResult(MyString);
}

我建议您看看ISynchronizeInvoke接口。

接口允许从任何线程调用方法,并封送处理调用正确线程的方法。

由于目标是同步执行任务,因此Invoke方法可用于将调用委派和封送给创建此对象的线程。使用此方法可确保流程或任务在返回之前完成。

实现这种方法非常简单:

public object Invoke(Delegate method, object[] args)
{
     return method.DynamicInvoke(args);
}

通常,您会按照以下方式使用此方法:invokerObj.Invoke(MyMethod)它在实现ISynchronizeInvoke接口的对象(invokerObj(管理的线程上执行MyMethod。

属性CCD_ 5和方法CCD_;如果您还希望异步执行委托,则可以实现EndInvoke。在这里可以找到一个很好的演示。

我希望这能解释更多。