2 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
獲取值后立即返回該值如何。不允許流程向前移動(dòng)并打破循環(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è)贊
為了簡(jiǎn)單起見(jiàn),您應(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)在來(lái)實(shí)現(xiàn)異步搜索所有數(shù)據(jù)庫(kù)的方法。我們將為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)任務(wù),在線程池線程中運(yùn)行。這是值得商榷的,但我們正在努力讓事情變得簡(jiǎn)單。我們還實(shí)例化 a CancellationTokenSource,并將其傳遞Token給所有Task.Run方法。這只會(huì)確保在我們得到結(jié)果后,不會(huì)再啟動(dòng)更多任務(wù)。如果線程池中的可用線程多于要搜索的數(shù)據(jù)庫(kù),則所有任務(wù)將立即開(kāi)始,取消令牌實(shí)際上不會(huì)取消任何內(nèi)容。換句話說(shuō),無(wú)論如何,所有啟動(dòng)的查詢都將完成。這顯然是一種資源浪費(fèi),但我們?cè)俅闻ψ屖虑樽兊煤?jiǎn)單。
啟動(dòng)任務(wù)后,我們將進(jìn)入一個(gè)等待下一個(gè)任務(wù)完成的循環(huán)(使用方法Task.WhenAny)。如果找到結(jié)果,我們?nèi)∠钆撇⒎祷亟Y(jié)果。如果未找到結(jié)果,我們將繼續(xù)循環(huán)以獲得下一個(gè)結(jié)果。如果所有任務(wù)都完成但我們?nèi)匀粵](mé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)注
- 182 瀏覽
添加回答
舉報(bào)