C# 使用'function().Wait()'调用异步函数有效,但'async function()'崩溃

C# 使用'function().Wait()'调用异步函数有效,但'async function()'崩溃,c#,.net,async-await,C#,.net,Async Await,我正在从我的C代码调用第三方库,发现ctx.CreateSiteAsynccommunicationSiteInfo.Wait;在等待ctx.CreateSiteAsynccommunicationSiteInfo时工作正常;导致应用程序崩溃。就我所知,Wait会导致线程阻塞,因此我对使用Wait方法很感兴趣。 下面是我的代码摘录,用于将上述调用置于上下文中: public async Task createSite(string base_url, SiteConfig sit

我正在从我的C代码调用第三方库,发现ctx.CreateSiteAsynccommunicationSiteInfo.Wait;在等待ctx.CreateSiteAsynccommunicationSiteInfo时工作正常;导致应用程序崩溃。就我所知,Wait会导致线程阻塞,因此我对使用Wait方法很感兴趣。 下面是我的代码摘录,用于将上述调用置于上下文中:

        public async Task createSite(string base_url, SiteConfig siteConfig) {
           using(var ctx = new OfficeDevPnP.Core.AuthenticationManager().GetAppOnlyAuthenticatedContext(base_url, this.applicationId, this.applicationSecret)) {
           ctx.Load(ctx.Web, p => p.Title);
           ctx.ExecuteQuery();

           CommunicationSiteCollectionCreationInformation communicationSiteInfo = new CommunicationSiteCollectionCreationInformation {
              Title = siteConfig.title,
              Url = siteConfig.url,
              SiteDesign = siteConfig.siteDesign,
              Description = siteConfig.description,
              Owner = siteConfig.ownerEmailAddress
           };

          try {
           // This works: ctx.CreateSiteAsync(communicationSiteInfo).Wait();
           await ctx.CreateSiteAsync(communicationSiteInfo);

          } catch....
如果我没有弄错的话,我把它叫做这个函数:。 我对C相当陌生,所以应用程序崩溃的原因可能很明显,但我不明白为什么等待不能工作,因为我调用的函数在其定义中有异步任务

EDIT:关于异常的奇怪之处在于,应用程序只是崩溃了,而且从未到达catch子句。我不知道,但这可能与线程或上下文有关,或者异步函数调用中抛出的异常不会返回到当前线程。应用程序在wait ctx.CreateSiteAsynccommunicationSiteInfo上崩溃;打电话

编辑2:看起来我可以简化手头的问题,但以此为例:

 public async Task StartMessageQueuePollAsync()
    {
        while (true)
        {
           await Task.Delay(1000).ConfigureAwait(false); 

            }

这会导致代码在等待任务.Delay1000.ConfigureAwaitfalse;时崩溃;。如果改为使用Task.Delay1000.Wait,代码将按预期工作

谢谢你在我的第一篇帖子上的评论。我现在可以工作了,相信这是因为我将主方法定义为异步,如下所示:
静态异步任务主

我知道你的答案,但我不认为这是根本原因。使用静态异步Task Main是非常好的,只要您的项目在引入时使用的是C7.0或更高版本。如果在删除async之后,更改它并使其他所有内容同步,使症状消失,那么这意味着在调用堆栈的某个地方,您错过了等待

例如,它可以很好地工作:

使用制度; 使用System.Threading.Tasks; 公共课程 { 公共静态异步任务主 { 控制台。写下Hello。; 等待暂停; Console.writeline全部完成; } 公共静态异步任务暂停{ 等待任务。延迟1000; Console.WriteLineOne暂停; } } 但是如果您删除Main中的wait,那么应用程序将在完成暂停打印之前结束。这是因为异步方法在开始时是同步运行的,但在对未完成的任务进行操作的第一次等待时返回。Pause在点击WAIT Task.Delay1000时返回任务-等待完成之前

因此,如果您不等待异步方法,那么在工作完成之前,您的代码将只移动到下一行。有时候你真的想要这个,但通常不是

因为它是同步运行的,所以将Wait替换为.Wait会停止线程,并且方法不会返回,从而使它突然工作

在您的代码中,这意味着要么您没有等待createSite,要么您没有等待调用createSite的方法,等等


微软有一系列非常好的关于异步的文章值得一读。从这里开始:

异常发生在哪里?怎么了?@vendettamit,我用更多的数据更新了帖子。请参阅编辑。检查您的windows事件日志。应该会记录异常。谢谢@vendettamit。我在事件查看器中查看了Windows日志>应用程序,但没有找到任何与我的应用程序相关的条目。关于第二个示例,如何调用StartMessageQueuePollAsync方法?