2014-04-10 31 views
0

我有一个表格,如下图所示,它接受一个Task<T>,等待完成,然后通过闭合形式await后返回:异步方法讷韦尔完成

public partial class SomeForm<T> : Form 
{ 
    public T ReturnValue { get; private set; } 
    private Task<T> Task { get; set; } 

    public SomeForm(string waitingText, Task<T> task) 
    { 
     InitializeComponent(); 

     ... 

     PerformTask(); 
    } 

    private async void PerformTask() 
    { 
     ReturnValue = await Task; 
     this.Close(); 
    } 
} 

然而,虽然这种方法运行令人高兴的是,它得到到ReturnValue = await Task;,然后不再进一步。该方法将正常运行而不被发送到该方法并且不会延迟。我有一种感觉它与我如何使用asyncawait做的,但我是新来的TPL等

请帮我找出什么地方错了上面的脚本,并确定为什么它永远不会返回。

编辑:TASKA是一个错字。这是任务的方法; ImportedFunctions。 BS_Robots_LoadDrive(..)是一个C++函数,其中同步工作得很好,即使在另一个线程(比如在最后片段)的的DllImport,但不与async参数中。

public uint LoadDisc() 
    { 
     uint response = ImportedFunctions.BS_Robots_LoadDrive(DriveLetters[0], 
         (int)BSRobotConstants.BIN_ID_DEFAULT, 
         (int)BSRobotConstants.POSITION_TYPE_INPUTBIN, 
         0); 

     switch (response) 
     { 
      case BSRobotConstants.OK: 
      case BSRobotConstants.OK_WITH_MESSAGE: 
      case BSRobotConstants.FROMTRAY_NO_DISC: 
      case BSRobotConstants.INVALID_DRIVE: 
      case BSRobotConstants.INVALID_POSITION: 
      case BSRobotConstants.TOTRAY_NO_DISC: 
      case BSRobotConstants.TOTRAY_NOT_OPEN: 
      case BSRobotConstants.FATAL_ERROR: 
       break; 
      case BSRobotConstants.BUSY: 

       break; 
      case BSRobotConstants.TOTRAY_HAS_DISC: 
       RejectDisc(); 
       response = LoadDisc(); 
       break; 
     } 

     return response; 
    } 

这工作:

private async void PerformTask() 
{ 
    Task.Start(); 
    Task.Wait(); 

    ReturnValue = Task.Result; 
    DialogResult = DialogResult.OK; 
} 

但第一代码片段没有。

+0

什么'TaskA'? – gleng

+0

两个问题。不要在构造函数中调用'async'方法,除了事件处理函数外,不要使用'async void'。 – Romoku

+0

1,勿使用事件处理程序的'异步void'方法例外,2.Show我们你是如何构建的'SomeForm'什么是你将它传递的参数?它来自哪里? –

回答

2

任务不会继续过去ReturnValue = await TaskA;,因为它没有返回。验证Task正在运行,没有卡住。

To属性效用async - 为对象的构造await使用一个异步工厂方法。

请参见:How to initialize an object using async-await pattern

public class Form1<T> : Form 
{ 
    public Form1(string waitingText, Task<T> task) 
    { 
     Task = Execute(task); 
     Controls.Add(new Label { Text = waitingText }); 
    } 

    public T ReturnValue { get { return Task.Result; } } 
    public Task<T> Task { get; private set; } 

    private async Task<T> Execute(Task<T> task) 
    { 
     var result = await task; 
     Close(); 
     return result; 
    } 
} 

用法:

var form = new Form1<int>("Hello", Task.Delay(1000).ContinueWith(_ => 1)); 
form.Show(); 

var returnValue = await form.Task; 
Console.WriteLine(returnValue);