2 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
獲取值后立即返回該值如何。不允許流程向前移動并打破循環(huán)。
using (var Contexts = instContextfactory.GetContextList())
{
foreach(var context in Contexts.GetContextList())
{
// how do I make all the calls and return data from the first call that finds data and continue with the further process.(don't care about other calls if any single call finds data.
var result = await context.Insurance.GetInsuranceByANI(ani);
if(result.Any())
{
return result.First();
}
}
}

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
為了簡單起見,您應(yīng)該首先改回您的GetInsuranceByANI方法以再次同步。稍后我們將生成任務(wù)以異步調(diào)用它。
public IEnumerable<Insurance> GetInsuranceByANI(string ani)
{
using (ITransaction transaction = Session.Value.BeginTransaction())
{
transaction.Rollback();
IDbCommand command = new SqlCommand();
command.Connection = Session.Value.Connection;
transaction.Enlist(command);
string storedProcName = "spGetInsurance";
command.CommandText = storedProcName;
command.Parameters.Add(new SqlParameter("@ANI", SqlDbType.Char, 0, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Default, ani));
var rdr = command.ExecuteReader();
return MapInsurance(rdr);
}
}
現(xiàn)在來實(shí)現(xiàn)異步搜索所有數(shù)據(jù)庫的方法。我們將為每個(gè)數(shù)據(jù)庫創(chuàng)建一個(gè)任務(wù),在線程池線程中運(yùn)行。這是值得商榷的,但我們正在努力讓事情變得簡單。我們還實(shí)例化 a CancellationTokenSource,并將其傳遞Token給所有Task.Run方法。這只會確保在我們得到結(jié)果后,不會再啟動更多任務(wù)。如果線程池中的可用線程多于要搜索的數(shù)據(jù)庫,則所有任務(wù)將立即開始,取消令牌實(shí)際上不會取消任何內(nèi)容。換句話說,無論如何,所有啟動的查詢都將完成。這顯然是一種資源浪費(fèi),但我們再次努力讓事情變得簡單。
啟動任務(wù)后,我們將進(jìn)入一個(gè)等待下一個(gè)任務(wù)完成的循環(huán)(使用方法Task.WhenAny)。如果找到結(jié)果,我們?nèi)∠钆撇⒎祷亟Y(jié)果。如果未找到結(jié)果,我們將繼續(xù)循環(huán)以獲得下一個(gè)結(jié)果。如果所有任務(wù)都完成但我們?nèi)匀粵]有結(jié)果,我們將返回 null。
async Task<IEnumerable<Insurance>> SearchAllByANI(string ani)
{
var tasks = new HashSet<Task<IEnumerable<Insurance>>>();
var cts = new CancellationTokenSource();
using (var Contexts = instContextfactory.GetContextList())
{
foreach (var context in Contexts.GetContextList())
{
tasks.Add(Task.Run(() =>
{
return context.Insurance.GetInsuranceByANI(ani);
}, cts.Token));
}
}
while (tasks.Count > 0)
{
var task = await Task.WhenAny(tasks);
var result = await task;
if (result != null && result.Any())
{
cts.Cancel();
return result;
}
tasks.Remove(task);
}
return null;
}
使用示例:
IEnumerable<Insurance> result = await SearchAllByANI("12345");
if (result == null)
{
// Nothing fould
}
else
{
// Do something with result
}
- 2 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)