很難說如果tasks per customer
方法能爲您帶來好處,找出它的最好方法就是對您的方案進行測試。
我做了一個簡單的事件(它看起來很雜亂),舉例說明如何修改第一種方法以允許每個客戶執行任務。
你已經提到你可以管理這個,我只是想在這裏發佈,所以任何對此感興趣的人都可以使用它。我使用Task.Run(...)
來模擬異步任務。
public class Account
{
public string AccountName { get; set; }
public string CustomerName { get; set; }
}
public class Card
{
public string CardName { get; set; }
public string AccountName { get; set; }
}
public List<Account> Accounts { get; set; }
public List<Card> Cards { get; set; }
//OLD
public async Task<string[]> FindAccounts(string customer)
{
return await Task.Run(() =>
{
return Accounts.Where(a => a.CustomerName == customer).Select(a => a.AccountName).ToArray();
});
}
//OLD
public async Task<string[]> FindCards(string[] accounts)
{
return await Task.Run(() =>
{
return Cards.Where(c => accounts.Contains(c.AccountName)).Select(a => a.CardName).ToArray();
});
}
//NEW
public async Task<string[]> FindCards(Task<string[]> findAccountsTasks)
{
return await Task.Run(async() =>
{
var accounts = await findAccountsTasks;
return Cards.Where(c => accounts.Contains(c.AccountName)).Select(a => a.CardName).ToArray();
});
}
//NEW
public async Task<string[]> FindCards(string customer)
{
return await await FindAccounts(customer).ContinueWith(FindCards);
}
private async void button7_Click(object sender, EventArgs e)
{
Accounts = new List<Account>
{
new Account {CustomerName = "Tomas", AccountName = "TomasAccount1"},
new Account {CustomerName = "Tomas", AccountName = "TomasAccount2"},
new Account {CustomerName = "Tomas", AccountName = "TomasAccount3"},
new Account {CustomerName = "John", AccountName = "JohnAccount1"}
};
Cards = new List<Card>
{
new Card {AccountName = "TomasAccount1", CardName = "TomasAccount1Card1"},
new Card {AccountName = "TomasAccount1", CardName = "TomasAccount1Card2"},
new Card {AccountName = "TomasAccount1", CardName = "TomasAccount1Card3"},
new Card {AccountName = "TomasAccount1", CardName = "TomasAccount2Card1"},
new Card {AccountName = "JohnAccount1", CardName = "JohnAccount1Card1"},
new Card {AccountName = "JohnAccount1", CardName = "JohnAccount1Card2"},
};
var customers = new List<string> { "Tomas", "John" }.ToArray();
//OLD
var accountstasks = customers.Select(FindAccounts);
var accounts = await Task.WhenAll(accountstasks);
var cardTasks = accounts.Select(FindCards);
var cards = await Task.WhenAll(cardTasks);
//NEW
cardTasks = customers.Select(FindCards);
cards = await Task.WhenAll(cardTasks);
}
你是對的,ContinueWith聽起來像你想要的。你將爲每個賬戶建立一個更大的任務「獲取賬戶,然後獲取卡」 – Juan
混合兩種方法怎麼樣?你知道有什麼缺點嗎? –
是的,我的意思是把它混合起來,你可以在ContinueWith上等待,基本上你可以等待任何返回Task和ContinueWith的東西。如果你顯示你的方法簽名,我可以提供一個示例代碼 – Juan