如何从异步中创建任务

时间:2013-11-25 16:16:44

标签: c# rest dynamics-crm-2011

我有一个电话,我需要等待才能继续。这是opportunitySet的初始创建,我遇到了将此转换为等待任务的问题。

_context.BeginSaveChanges(OnCreateOpportunityComplete, _context.OpportunitySet);


/// <summary>
/// Callback method invoked when Account is done being created.
/// </summary>
/// <param name="result"></param>
private void OnCreateOpportunityComplete(IAsyncResult result)
{
    try
    {
        _context.EndSaveChanges(result);
        Opportunity createdOpportunity = result.AsyncState as Opportunity;
        BeginRetrieveOpportunity(createdOpportunity.OpportunityId);
    }
    catch (SystemException se)
    {
        _syncContext.Send(new SendOrPostCallback(showErrorDetails), se);
    }
}

private void BeginRetrieveOpportunity(Guid _id)
{
    try
    {
        DataServiceQuery<Opportunity> query = (DataServiceQuery<Opportunity>)_context
                .OpportunitySet.Where<Opportunity>(o => o.OpportunityId == _id);
            query.BeginExecute(OnRetrieveOpportunityComplete, query);

    }
    catch (DataServiceQueryException dsqe)
    {
        _syncContext.Send(new SendOrPostCallback(showErrorDetails), dsqe);
    }
}

有谁知道如何处理这个问题?我已经尝试了很多次,在创建任务时似乎存在一些问题。或者,如果有任何其他方式可以等待创建的集合中的多个机会,那将是非常棒的。

编辑:为了澄清,代码中的第一行是我的主函数中的一行,在我收集了所有想要添加的机会之后,我调用create方法来调用CRM工具包中提供的插入。这确实是插入的,但是当程序到达终点时,通常不会创建所有的机会。

2 个答案:

答案 0 :(得分:-1)

制作方法时,请务必将其标记为“异步”。然后在调用它时不要使用关键字“await”,你将得到它的任务。从他们可以调用yourTask.Wait()。这将等到该方法的执行完成后才会结束。

答案 1 :(得分:-1)

我无法确定你想要制作哪种方法async,因为你的问题有点不清楚,但如果你按照这个简单的方法,你应该能够制作自己的async方法。假设你从这个方法开始:

private int DoSomething(int someValue)
{
    ...
}

我们可以用async以这种方式运行它:

private async int DoSomethingAsync(int someValue)
{
    int result = await Task.Run(() => DoSomething(someValue));
    // Do something with result here when it arrives
}

更新&gt;&gt;&gt;

您可以在Silverlight中使用Task.Wait method。如果您查看MSDN上的How to: Wait on One or More Tasks to Complete页面,您可以了解它是如何完成的。此页面仅适用于.NET 4和4.5,因此我不知道它是否可以与Silverlight一起使用,但您可以尝试。您仍然可以像我在上面的示例中向您展示的Task中使用您的方法。