Task.Run是否保证每个方法都会运行完成

时间:2018-11-14 22:38:47

标签: c#-4.0 async-await task-parallel-library

有两种方法, 必须并行运行,这是由于时间限制所致。例如,每隔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, 道格

1 个答案:

答案 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中不可用。