Async和Await进程中的实体对象
本文关键字:实体 对象 进程 Await Async | 更新日期: 2023-09-27 17:50:57
我正在尝试使用Async和Await进行上传过程。我创建了一个小代码,看看它是否工作。
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
TestAsync().Wait();
}
}
public static async Task TestAsync()
{
await Task.Run(() => {
Thread.Sleep(1000);
var context = new CommonEntities();
context.AddToDummies(new Dummy { TimeStamp = DateTime.Now, Caption = "Async" });
context.SaveChanges();
});
}
}
但由于某种原因,它从未到达Console.WriteLine
。如果我用var stringBuilder = new StringBuilder();
代替var context = new EntityObject();
,那么它就工作了。
这个想法是,我将创建一个方法,它有许多复杂的过程,保存和更新数据库,以及调用web服务和存储结果到数据库等。假设该方法称为MethodA
。
public static async void test()
{
await Task.Run(() => MethodA());
}
但在进一步讨论之前,我被困在这个简单的测试中。知道为什么吗?
除了事件处理程序,你不应该在任何地方使用async void
。
async void
不允许调用者等待(异步或其他)操作完成,它只是继续前进。在您的示例中,它到达Main
的末尾,在您有机会到达Console.WriteLine
之前,应用程序就结束了。
您需要更改TestAsync
以返回Task
并在Main
中等待它:
static void Main()
{
TestAsync().Wait();
}
public static async Task TestAsync()
{
await Task.Run(() =>
{
var objectContext = new CommonEntities();
Console.WriteLine("Processed");
});
}