C#将任务线程设为前台线程

6

我正在使用Task来创建并在不同的线程上执行一些操作,一旦操作完成,我还会调用回调函数。

 System.Threading.Tasks.Task.Factory.StartNew(() =>
                   this._httpService.CreateRecord(new Uri(Configuration.Current.CreateRecordUrl), httpObj)).ContinueWith(
                   (response) =>
                   {
                       if (!response.IsFaulted)
                       {
                           if (httpObj.CallBack != null)
                           {
                               httpObj.CallBack(response.Result);
                           }
                       }
                       else {
                           this._logger.Error("There was some error which causes the task to fail");


                       }
                   });

我的控制台应用程序的主线程不会等待任务线程完成,因为它是后台线程。如何将任务线程变成前台线程

谢谢。


1
你不确定自己想要实现什么?如果只是等待结果,为什么不直接使用 await 呢? - Robba
@Robba 如果我使用await,那么我的主线程将被阻塞,这是我不想要的。 - Pavan Tiwari
但是你说主线程没有等待任务完成。当一个线程在等待时,它会自动阻塞。所以我的问题是,如果你想要等待而不阻塞,你期望的行为是什么? - Robba
4个回答

4

StartNew() 方法返回一个 Task 实例。在返回的任务上调用 Wait() 方法将阻塞主线程,直到该任务完成。

static void Main(string[] args)
{
    var task = Task.Factory.StartNew(() =>
    {
        // ...
    });
    task.Wait(); // The main application thread waits here until the task returns
}

3
我的控制台应用程序的主线程没有等待任务线程完成,因为它是后台线程。
您的应用程序没有等待任务,因为您没有告诉它这样做。
正如其他人已经指出的那样,根据您是否处于异步上下文中,使用Wait/Result或await等待任务。
我如何使任务线程成为前台线程。
在大多数情况下,您首先不想这样做。后台线程是一种在线程池中终止所有前台线程后才终止的线程。如果您实际上想将任务调度到前台线程(即使主线程已完成,也会保持应用程序进程活动的线程),则必须创建自己的TaskScheduler。顺便说一句,这将是使用Task.Factory.StartNew的原因。如果您不需要Task.Factory.StartNew,请使用Task.Run。

2

您应该在主线程中等待任务完成。

将您的代码更改为

var task =  System.Threading.Tasks.Task.Factory.StartNew(() =>
    this._httpService.CreateRecord(new Uri(Configuration.Current.CreateRecordUrl), httpObj)).ContinueWith(
        (response) =>
        {
            if (!response.IsFaulted)
            {
                if (httpObj.CallBack != null)
                {
                    httpObj.CallBack(response.Result);
                }
            }
            else {
                this._logger.Error("There was some error which causes the task to field");
            }
        });
task.Wait();  // Wait till your Task has finished.

Wait() 方法有一些重载可以指定等待的时间。如果任务由于异常或取消而执行失败,还需要添加一些异常处理。


1
尝试创建一个全新的线程,而不是从线程池中获取。例如:
Thread t = new Thread(()=> 
{
    //all your code goes here
});
t.IsBackground = false; //by default it will be foreground. so don't need this line in your case
t.Start();

这将为您创建一个前台线程,并确保该线程完成其执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接