Windows phone 8 在第二次运行应用程序时等待任务会导致异常

Windows phone 8 在第二次运行应用程序时等待任务会导致异常,windows-phone-8,async-await,wcf-data-services,portable-class-library,winrt-component,Windows Phone 8,Async Await,Wcf Data Services,Portable Class Library,Winrt Component,设置: 我有一个包含几个PCL的代码库,其中一个PCL是一组调用我的WCF数据服务的数据访问类。我已经利用Task.Factory.fromsync来管理调用WCF数据服务的beginExecute/endExecute。然后我等待结果并将数据发送到应用程序。我首先创建了一个Win Store应用程序,一切都很顺利。现在我正在创建WinPhone8UI。现在我遇到了麻烦。该障碍似乎是等待task.Factory.FromAsync方法创建的任务的行上的异常。使事情进一步复杂化的是,如果我第一次安

设置: 我有一个包含几个PCL的代码库,其中一个PCL是一组调用我的WCF数据服务的数据访问类。我已经利用Task.Factory.fromsync来管理调用WCF数据服务的beginExecute/endExecute。然后我等待结果并将数据发送到应用程序。我首先创建了一个Win Store应用程序,一切都很顺利。现在我正在创建WinPhone8UI。现在我遇到了麻烦。该障碍似乎是等待task.Factory.FromAsync方法创建的任务的行上的异常。使事情进一步复杂化的是,如果我第一次安装并运行应用程序,则不会发生异常。第二次打开应用程序时,会抛出错误。所以我真的很困惑,为什么第二次运行会导致错误,因为所有相同的逻辑都被遵循。我得到的异常不是来自代码中的任何内容,而是来自.NET库本身。为了解决这个神秘的问题,我尝试了其他一些方法。我创建了一个Task.Delay()任务,该行没有问题,但是当我调用其任务上的wait时,我得到了完全相同的错误。我尝试只获取Task.Result而不是等待它,结果从未返回,因此应用程序只是挂起(并且也从未引发异常)

我在WinRT应用程序中没有遇到任何问题,所以我猜我所有的逻辑都是合理的,不应该有任何奇怪的线程问题,等等

例外情况:

mscorlib.ni.dll中发生类型为“System.Reflection.TargetInvocationException”的第一次意外异常 当我得到这个异常时,我在VisualStudio中也会得到一个标签,上面写着“源代码不可用”。这对我来说是有道理的,但这个例外并不能帮我解决所有问题,我无法获得更多细节。我似乎找不到内部异常(如果有)来获取更多细节

守则:

var retMasterDataEntryInfos = new List<Model.MasterData.MasterDataEntryInfo>();

        try
        {
            var task = Task.Factory.FromAsync(_entities.MasterDataEntryInfoes.BeginExecute,
                (result) => _entities.MasterDataEntryInfoes.EndExecute(result),
                null);

            return await task.ContinueWith((result) =>
            {
                string a = string.Empty;
                if (result != null && result.Result != null && result.Exception == null)
                {
                    foreach (var r in result.Result)
                    {
                        var newMDEI = new Model.MasterData.MasterDataEntryInfo()
                        {
                            Id = r.Id,
                            KeyName = r.KeyName,
                            Name = r.Name,
                            LastUpdated = r.LastUpdated
                        };
                        newMDEI.DatabaseCreationCleanup();

                        retMasterDataEntryInfos.Add(newMDEI);
                    }
                }
                return retMasterDataEntryInfos;
            });
        }
        catch (Exception ex)
        {
            string a = string.Empty;
        }

        return retMasterDataEntryInfos;
var retmasterdataentryinfo=new List();
尝试
{
var task=task.Factory.fromsync(_entities.masterdataentryinfo.BeginExecute,
(结果)=>\u entities.MasterDataEntryInfo.EndExecute(结果),
无效);
返回等待任务。继续((结果)=>
{
string a=string.Empty;
if(result!=null&&result.result!=null&&result.Exception==null)
{
foreach(result.result中的var r)
{
var newMDEI=newmodel.MasterData.MasterDataEntryInfo()
{
Id=r.Id,
KeyName=r.KeyName,
Name=r.Name,
LastUpdated=r.LastUpdated
};
newMDEI.DatabaseCreationCleanup();
retmasterdataentryinfo.Add(newMDEI);
}
}
返回RetMasterDataEntryInfo;
});
}
捕获(例外情况除外)
{
string a=string.Empty;
}
返回RetMasterDataEntryInfo;
错误发生在“return await task.ContinueWith((result)=>”行。正如您所看到的,我添加了一个try/catch,这甚至无助于控制问题,因为从未调用catch块


任何建议都将不胜感激,包括问题的解决方案或调试帮助,以获得更好的异常细节。我刚刚绞尽脑汁想明白这一点,我马上就来。这真令人沮丧,因为我希望所有的艰苦工作都用WinRT应用程序完成,现在我需要做的就是在windows pho上创建一个快速简单的UIne 8.我希望能给我的老板一个惊喜,告诉他你想要一个WinRT应用程序,但我们能够重用我们所有的代码,并且用最少的额外工作轻松获得两个平台。非常感谢你的帮助!

你的
任务
是任务类型吗?你正在等待
任务
并且也在使用ContinueWith。这不是一个问题良好的实践。您不应将两者混合。如果任务类型为task(这绝对没有逻辑意义),然后同时等待
var task2=await task;
var result=await task2;我的任务不是task类型。我调用的是WCF OData服务,因此返回类型是task。因此,基本上我所做的是要求该服务返回DTO,以便我可以填充我的业务对象。这会改变您的看法吗“等待任务。继续".既然你提到了,我同意我可以直接等待任务,而不是调用ContinueWith。除非我遗漏了一些不太明显的内容,否则我计划将其留给ContinueWith,将来我将直接调用Wait task以获得我的结果,因为我同意它更清晰、更易于阅读。好的,删除ContinueWith,然后等待任务完成Self我已经将上面的代码直接插入我的ViewModel代码中,看看这是否可以隔离问题,它是否有帮助。此时,我将问题锁定在Caliburn.Micro(CM)上。我在WinRT中使用CM没有任何问题。我使用CM EventAggregator将消息传递到单独的类。显然,在WinRT中这是可以的,但在Win Phone 8中存在一些问题。在这种情况下,我可以在CM中丢弃事件消息,只需自己调用ViewModel上的一个方法。这似乎解决了此问题。幸运的是,我这样做了nk我只在其他一两个地方使用了EventAggregator。哦,非常感谢你的帮助和建议Shawn。我想我还有一些东西要尝试,但我(错误地)认为Caliburn.Micro非常稳定,我可以在这两个平台上假设常见的行为。