C# 我如何使我的应用程序运行或等到我的;任务“;完成?

C# 我如何使我的应用程序运行或等到我的;任务“;完成?,c#,task,C#,Task,我有下面的c#代码,其职责是从数据库中获取详细信息并执行一些操作 static void Main(string[] args) { try { ProcessTask().Wait(); } catch (Exception ex) { Console.WriteLine($"There was an exception: {ex.ToString()}

我有下面的
c#
代码,其职责是从
数据库中获取详细信息并执行一些操作

   static void Main(string[] args)
    {
        try
        {
            ProcessTask().Wait();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"There was an exception: {ex.ToString()}");
        }
    }
这就是任务

    static private async Task ProcessTask()
    {
        //Connect to database
        //fetch data 
        //update data based on condition
    }
但是我的程序在完成任务之前就出来了

ProcessTask
中的一个方法正在等待“已连接”事件,因此任务假定它已完成

最终目标:我想在windows计划程序中运行此代码。这样每一个小时我就可以检查数据库并进行更新。所以我不能使用“console.readline()”

试试这个

static async Task Main(字符串[]args)
{
尝试
{
等待ProcessTask();
}
捕获(例外情况除外)
{
WriteLine($“出现异常:{ex.ToString()}”);
}
}
您喜欢下面的内容吗

static void Main(string[] args)
    {
        callMethod();
        Console.ReadKey();
    }

    public static async void callMethod()
    {
        Task<int> task = Method1();
        int count = await task;
        Method2(count);
    }
    // Do your db call here
    public static async Task<int> Method1()
    {
        int count = 0;
        await Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(" Method 1");
                count += 1;
            }
        });
        return count;
    }


    public static void Method2(int count)
    {
        Console.WriteLine("Total count is " + count);
    }
static void Main(字符串[]args)
{
callMethod();
Console.ReadKey();
}
公共静态异步void callMethod()
{
任务=方法1();
int count=等待任务;
方法2(计数);
}
//你在这里打电话吗
公共静态异步任务方法1()
{
整数计数=0;
等待任务。运行(()=>
{
对于(int i=0;i<100;i++)
{
控制台写入线(“方法1”);
计数+=1;
}
});
返回计数;
}
公共静态无效方法2(整数计数)
{
Console.WriteLine(“总计数为”+计数);
}

我假设您正在控制台应用程序中执行此操作。所以我建议做两个改变

static void Main(string[] args)
{
    try
    {
        ProcessTask()
           .GetAwaiter()
           .GetResult(); // This will give you a better exception details compared to Task.Wait().
    }
    catch (Exception ex)
    {
        Console.WriteLine($"There was an exception: {ex.ToString()}");
#if DEBUG
        Console.ReadLine(); // Generic error handler. Stop exiting. So you can read the exception. 
#endif
    }
}

您的代码似乎正确,调用
.Wait()
将确保任务在继续之前完成。你怎么知道它在完成之前就出来了?我最后保留了一个调试器,当它从最后一行出来时,应用程序控制台窗口关闭了。哦,这只是意味着应用程序完成了,我很确定你的任务已经完成了。如果要保持控制台窗口打开,请在
.Wait()
行之后添加
console.ReadLine()
。我已更新了问题和最终目标。请检查我无法使用Console.ReadKey();,因为我是作为调度程序部署它的。是的,我是在控制台应用程序中部署的。一旦一切正常,我想把EXE放到windows调度程序中,这样它就可以每一小时运行一次。因此,我不能使用“Console.Readline”
Console.Readline()
仅用于调试。您可以使用
#if DEBUG
对其进行修饰,以确保它未在生产环境中运行。如果您计划在生产中使用此功能,则添加正确的日志记录也很重要。@KosalaW您不需要Console.ReadLine。如果使用调试器启动程序,它将在发生异常的位置停止。如果不需要调试器,请使用Ctrl+F5启动调试器,调试器将在最后保持控制台窗口打开。@ckuri对于未处理的异常,这是正确的。在这种情况下,OP有一个通用异常处理程序。