我在使用await和async的.NET Framework 4.5中遇到多线程问题。
这是代码。
List<Task<string>> t = new List<Task<string>>();
for (Row = 0; Row < lines.Count; Row++)
{
if (Row != 0 && lines[Row].Length >= CCColumnToken && lines[Row][CCColumnToken] != "")
{
t.Add(AccessPaymentVault(Row, credentials, cts.Token));
}
}
string[] str_list = await Task.WhenAll(t.ToArray());
在下面的异步函数中,似乎执行了Tokenization.Retrive
。但在检索数据之前,whenAll完成并保存数据。
async Task<string> AccessPaymentVault(int row, Credentials credentials, CancellationToken ct){
var data = await Task.Factory.StartNew(() =>
{
return Tokenization.Retrieve(credentials, lines[row][CCColumnToken]);
}, ct);
var returnData = Encryptor.Decrypt(data);
if (returnData != null)
{
JObject obj = JObject.Parse(returnData);
lines[row][CCColumnNum] = (string)obj["cardNo"];
lines[row][CCColumnExpiry] = (new DateTime(Int32.Parse((string)obj["expiryYYYY"]), Int32.Parse((string)obj["expiryMM"]), 1)).ToString("MM/yy");
}
return returnData;
}
有时代码效果很好,但有时候我认为当所有代码都不起作用时,某些结果(随机)是空的。任何帮助将不胜感激。
谢谢。