我有一个表格,如下图所示,它接受一个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;
,然后不再进一步。该方法将正常运行而不被发送到该方法并且不会延迟。我有一种感觉它与我如何使用async
和await
做的,但我是新来的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;
}
但第一代码片段没有。
什么'TaskA'? – gleng
两个问题。不要在构造函数中调用'async'方法,除了事件处理函数外,不要使用'async void'。 – Romoku
1,勿使用事件处理程序的'异步void'方法例外,2.Show我们你是如何构建的'SomeForm'什么是你将它传递的参数?它来自哪里? –