C# Task.Run无法处理等待的方法
我们遇到了这样一种情况,即在调用过程中需要启动和执行几个启动和遗忘线程。但是,如果异步方法有任何等待的调用,我们的调用将无法执行 这里有一个例子。我们错过什么了吗C# Task.Run无法处理等待的方法,c#,asp.net-core,asynchronous,salesforce,C#,Asp.net Core,Asynchronous,Salesforce,我们遇到了这样一种情况,即在调用过程中需要启动和执行几个启动和遗忘线程。但是,如果异步方法有任何等待的调用,我们的调用将无法执行 这里有一个例子。我们错过什么了吗 public class SomeClass { public async Task Test() { //Calling synchronously this things works await Save(1).ConfigureAwait(false); awai
public class SomeClass
{
public async Task Test()
{
//Calling synchronously this things works
await Save(1).ConfigureAwait(false);
await Save(2).ConfigureAwait(false);
await Save(3).ConfigureAwait(false);
//Starting three threads at the same time fails while trying to run var queryResult = await SomeClient.QueryAsync<T>(q).ConfigureAwait(false);
_ = Task.Run(async () => await Save(1));
_ = Task.Run(async () => await Save(2));
_ = Task.Run(async () => await Save(3));
}
public async Task<bool> Save(int ct)
{
var x = await Update(ct).ConfigureAwait(false);
return x;
}
public async Task<bool> Update(int ct)
{
await _someObject.CallingSomeAsyncMethod<dynamic>("Some Query").ConfigureAwait(false);
await _someObject.CallingSomeAsyncMethod<dynamic>("Some Query").ConfigureAwait(false);
await _someObject.CallingSomeAsyncMethod<dynamic>("Some Query").ConfigureAwait(false);
return true;
}
}
public class SomeObject
{
public async Task<T> CallingSomeAsyncMethod(string q)
{
await Task.Delay(1000).ConfigureAwait(false);
//OR Any async method which is awaited here just stops the execution
return queryResult;
}
}
公共类SomeClass
{
公共异步任务测试()
{
//同步调用这些东西是有效的
等待保存(1)。配置等待(false);
等待保存(2)。配置等待(false);
等待保存(3)。配置等待(false);
//尝试运行var queryResult=await SomeClient.QueryAsync(q).ConfigureAwait(false)时,同时启动三个线程失败;
_=Task.Run(异步()=>等待保存(1));
_=Task.Run(异步()=>等待保存(2));
_=Task.Run(异步()=>等待保存(3));
}
公共异步任务保存(int-ct)
{
var x=等待更新(ct)。配置等待(false);
返回x;
}
公共异步任务更新(int-ct)
{
wait _someObject.callingsomeasynchmethod(“某些查询”).configurewait(false);
wait _someObject.callingsomeasynchmethod(“某些查询”).configurewait(false);
wait _someObject.callingsomeasynchmethod(“某些查询”).configurewait(false);
返回true;
}
}
公共类对象
{
公共异步任务调用SomeAsyncMethod(字符串q)
{
等待任务。延迟(1000)。配置等待(false);
//或者这里等待的任何异步方法都只是停止执行
返回查询结果;
}
}
如果要同时运行多个任务,则应在不使用等待
的情况下调用这些方法并保持任务。然后您可以执行wait Task.whalll(task1、task2、task3,…)代码>By无法执行,您的意思是该方法甚至没有被调用吗?如果在Save
中放置断点,它是否会被命中?Save()会被调用,但它会在等待某个客户端后停止执行。querysync(q)。ConfigureAwait(false);第一根线是热的。另一个问题是我无法捕获任何错误。从不到达catch块(如果在queryAsync方法上放置了一个try catch,那么queryAsync方法是什么样子的?您是否有任何wait
s在那里,或者您只是开始任务并返回它?老实说,我无法通过将queryAsync替换为例如task.Delay()来重现您的情况)。我可以捕获异常,所有代码都可以正常运行。您的第三方库中一定发生了某种挂起,可能它无法连接,只是在等待超时。如何调用Test
?我们不希望同时运行一组任务。示例来自一个测试类。我们必须在每个测试时在单独的线程上运行k run来自UIK如果你“必须”在不同的线程上运行它们,你就不应该使用TPL。不能保证有新的线程。我们应该使用什么?