如何在重复之前等待任务完成
How to wait for task to complete before repeating it
如何等待任务完成后再重复它
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);
}
我建议你看一下 ISynchronizeInvoke
界面。
该接口允许从任何调用适当线程的线程和编组调用方法。
由于目标是同步执行任务,因此 Invoke
方法可用于委托和编组对创建此对象的线程的调用。
使用此方法可确保流程或任务在返回前完成。
实现此方法非常简单:
public object Invoke(Delegate method, object[] args)
{
return method.DynamicInvoke(args);
}
通常您会按如下方式使用此方法:invokerObj.Invoke(MyMethod)
它在实现 ISynchronizeInvoke 接口的对象 (invokerObj) 管理的线程上执行 MyMethod。
属性 InvokeRequired
和方法 BeginInvoke
& EndInvoke
如果您还希望异步执行委托的可能性,则可以实现。在 here.
上可以找到一个很好的演示
我希望这能解释得更清楚一些。
在 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);
}
如何等待任务完成后再重复它
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);
}
我建议你看一下 ISynchronizeInvoke
界面。
该接口允许从任何调用适当线程的线程和编组调用方法。
由于目标是同步执行任务,因此 Invoke
方法可用于委托和编组对创建此对象的线程的调用。
使用此方法可确保流程或任务在返回前完成。
实现此方法非常简单:
public object Invoke(Delegate method, object[] args)
{
return method.DynamicInvoke(args);
}
通常您会按如下方式使用此方法:invokerObj.Invoke(MyMethod)
它在实现 ISynchronizeInvoke 接口的对象 (invokerObj) 管理的线程上执行 MyMethod。
属性 InvokeRequired
和方法 BeginInvoke
& EndInvoke
如果您还希望异步执行委托的可能性,则可以实现。在 here.
我希望这能解释得更清楚一些。
在 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);
}