有两种方法, 必须并行运行,这是由于时间限制所致。例如,每隔100毫秒就要处理下一个数据。
List<Widget> widgetList = new List<Widget>()
{
file list with 100 widget objects
}
List<Task> tasks = new List<Task>();
foreach (Widget widget in widgetList)
{
Task t = Task.Run(async () =>
{
var result = await widget.Analyze(newData);
ReportResults(result);
});
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
不,这不是完整的代码示例,但对于以下问题应该足够了: 我是否可以确定ReportResults(结果)将按任务运行至完成,还是可能某个任务完成并调用ReportResults(结果),然后另一个任务可以调用ReportResults(结果),从而导致行为无法预测? >
TIA, 道格
答案 0 :(得分:1)
每个方法都将运行完成,除非会破坏进程或应用程序域。
作为“调用ReportResults(result)导致无法预测的行为”,它取决于const functions = require('firebase-functions');
const admin = require('firebase-admin');
const stripe = require('stripe')("sk_test_...");
stripe.setApiVersion('2018-11-08');
admin.initializeApp(functions.config().firebase);
exports.ephemeral_keys = functions.https.onRequest((req, res) => {
const stripe_version = req.api_version;
if (!stripe_version) {
console.log('error with stripe version')
console.log(stripe_version)
res.status(400).end();
return;
}
const uid = req.params.uid;
const user = admin.firestore().collection('users').doc(uid);
console.log('Customer id ' + user.customerId);
stripe.ephemeralKeys.create(
{customer: user.customerId},
{stripe_version: stripe_version}
).then((key) => {
console.log('Ephemeral key ' + key);
res.status(200).json(key);
}).catch((err) => {
res.status(500).end();
});
});
的工作方式。
我会改成这样:
ReportResults
注意::var results = await Task.WhenAll(
for widget in widgetList
select widget.Analyze(newData));
foreach (var result in results)
{
ReportResults(result);
}
是C#5.0的一项功能,在C#4.0中不可用。