是task.Start()在后台运行

时间:2018-07-30 10:25:33

标签: c# task

我有大量记录,可以通过移动设备向其他移动设备发送推送通知。

为此,我正在for内使用task.Start()循环。我想知道task.Start()是否在后台运行吗?这样一来,在同时向移动设备发送远程通知的同时,我还可以做其他一些事情,并且不会阻止移动用户界面。

下面我正在使用的代码

var pushTask = new Task(() =>
{
    if (myPushDataFilterd.Any())
    {
        var title = txtHomeworkTitle.Value.Trim();
        for (int index = 0; index < myPushDataFilterd.Count; index++)
        {
            var row = myPushDataFilterd[index];

            jData.Add("moduleName", "Homework");
            jData.Add("organizationId", ddlOrganization.SelectedValue);
            jData.Add("studentId", studentId);
            jGcmData.Add("to", to);
            jGcmData.Add("data", jData);
            api = row.ServerKeyPush;                                       

            var url = new Uri("https://fcm.googleapis.com/fcm/send");

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=" + api);
                var r = client.PostAsync(url, new StringContent(jGcmData.ToString(), Encoding.Default, "application/json")).Result;
            }
        }
    }
});
pushTask.Start();

实际上,这是我现在在移动应用程序中使用的Web应用程序部分。在移动应用程序中,我还有其他更好的选择可以发送通知吗?

2 个答案:

答案 0 :(得分:1)

Task通常表示异步操作,因此除非您想通过显式等待读取其值,否则不会阻塞任务块中的代码,例如,请检查以下内容:

  Task myTask = new Task( () => Console.WriteLine("It is me myTask ^_^ "));
  myTask.Start();
  Console.WriteLine("Currently not waiting the output from myTask");
  myTask.Wait();//Now I am waiting
  //Output:
  //Currently not waiting the output from myTask
  //It is me myTask ^_^ 

您还可以使用Task.RunTaskFactory.StartNew在一条语句中创建和启动任务。 有关它们之间用法差异的更多信息,请检查link

答案 1 :(得分:1)

创建任务根本没有意义。您正在执行IO操作,因此可以使用已经提供的异步api。

private async Task PostData()
{
    if (myPushDataFilterd.Any())
    {
        var title = txtHomeworkTitle.Value.Trim();
        using (var client = new HttpClient())
        {
            for (int index = 0; index < myPushDataFilterd.Count; index++)
            {
                var row = myPushDataFilterd[index];

                jData.Add("moduleName", "Homework");
                jData.Add("organizationId", ddlOrganization.SelectedValue);
                jData.Add("studentId", studentId);
                jGcmData.Add("to", to);
                jGcmData.Add("data", jData);
                api = row.ServerKeyPush;                                       

                var url = new Uri("https://fcm.googleapis.com/fcm/send");
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=" + api);
                var r = await client.PostAsync(url, new StringContent(jGcmData.ToString(), Encoding.Default, "application/json"));
            }
        }
    }
}