2016-02-26 36 views
2

我想异步执行CPU密集型工作。我认为使用这样的代码之一:如何返回IAsyncOperation <TReturn>结果?

.... 
    updateGUIObj = await setSelectedGUICellValueAsync(arg1, arg2, cssId, isInitializeCbxChecked); 
    .... 


    public IAsyncOperation<UpdateGUIObj> setSelectedGUICellValueAsync(int arg1, int arg2, String cssId, bool isInitializeCbxChecked) 
    { 
     updateGUIObj = new UpdateGUIObj(); 

     .... // compute intensive work setting "updateGUIObj" 

     return ?????; 
    } 

我应该怎么写上面return声明?

+0

你为什么不使用任务API?如果需要,Task.Run将在另一个线程中执行并返回一个可等待的任务。 – Gusman

回答

2

您可以使用异步/等待模式,并返回Task<>对象,而不是:如果你正在写一个WinRT的组件

... 
var updateGUIObj = await setSelectedGUICellValueAsync(arg1, arg2, cssId, isInitializeCbxChecked); 
... 

public async Task<UpdateGUIObj> setSelectedGUICellValueAsync(int arg1, int arg2, String cssId, bool isInitializeCbxChecked) 
{ 
    var updateGUIObj = new UpdateGUIObj(); 

    // .... compute intensive work setting "updateGUIObj" 

    return updateGUIObj; 
} 
3

返回IAsyncOperation<TResult>是必要的。不过,我建议将IAsyncOperation<TResult>代码编写成更简单的包装,以实现更自然的async/await实现。

有这是为这种情况专门编写的extension method

public IAsyncOperation<UpdateGUIObj> setSelectedGUICellValueAsync(int arg1, int arg2, String cssId, bool isInitializeCbxChecked) 
{ 
    return SetSelectedGuiCellValueAsync(arg1, arg2, cssId, isInitializeCbxChecked).AsAsyncOperation(); 
} 

private async Task<UpdateGUIObj> SetSelectedGuiCellValueAsync(int arg1, int arg2, String cssId, bool isInitializeCbxChecked) 
{ 
    updateGUIObj = new UpdateGUIObj(); 
    await Task.Run(....); 
    return updateGUIObj; 
} 
+0

谢谢斯蒂芬。从我对这个[link](https://msdn.microsoft.com/library/hh191443%28vs.110%29.aspx)的初步阅读中,我想我必须返回一个'IAsyncOperation '。随着您的评论,我重新阅读它,现在很清楚,我只需要返回上述解决方案中提出的“任务”。 – ema3272