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有一个通用异常处理程序。