我从WinForm测试过,因为我听说Console应用程序谎言async
:
List<string> lstFiles = new List<string>();
lstFiles = FillList(); // File list with all files to Process
List<PSObject> lstRetVals = new List<PSObject>();
try
{
foreach (string strFullFile in lstFiles)
{ lstRetVals.AddRange(clsOne.TestFifteen(strFullFile)); }
}
catch (Exception ex)
{throw ex ;}
这个中间方法基本上就在这里因为我正在测试正确使用await。似乎不使用等待和阻止最适合我的使用..
//public async Task<int> TestFifteen(string pStrFullFilePathFileNm)
// as you see from this previous Signature
public List<PSObject> TestFifteen(string pStrFullFilePathFileNm)
{
int iRetVal = -99;
Task<PSDataCollection<PSObject>> tRetval = null;
List<PSObject> lstPsObjs = null;
try
{
tRetval = TestFifteenSub(pStrFullFilePathFileNm);
lstPsObjs = tRetval.Result.ToList();
}
catch (Exception zz)
{ throw zz; }
// Debug.WriteLine("Is this OK");
foreach (PSObject psobj in tRetval.Result)
{
iRetVal = tRetval.Result.Count;
// return Task<PSDataCollection<PSObject>> or
}
//return iRetVal;
return lstPsObjs;
}
最后关注的领域:---- Task.Factory.FromAsync ----我必须使用它,因为Powershell API还没有TAP实现..那么这条线实际上是Async吗?实际上开始一个新线程?
public Task<PSDataCollection<PSObject>> TestFifteenSub(string p_scriptText)
{
//var tcs = new TaskCompletionSource<int>();
PowerShell ps = PowerShell.Create();
ps.AddScript(p_scriptText);
Task<PSDataCollection<PSObject>> plpl;
PSDataCollection<PSObject> psDtaColOfpsDtaObjs = null;
List<PSObject> lstPSObjs = null;
try
{
plpl = Task.Factory.FromAsync(ps.BeginInvoke(), pResult => ps.EndInvoke(pResult)); // BLOCKS here No await Keyword so it waits for this call to complete
//await taskQue;
psDtaColOfpsDtaObjs = plpl.Result;
lstPSObjs = plpl.Result.ToList();
// lstPSObjs = convertedObject.ToList();
}
catch (Exception vv)
{ throw vv; }
// return plpl.Result;
return plpl;
}
答案 0 :(得分:3)
我从WinForm测试过,因为我听说Console应用程序存在异步内容
用于读取到控制台的控制台 API没有正确使用异步实现,但这不会影响任何实现其他API。异步控制台唯一的另一个问题是你必须有一个顶级阻塞调用,所以主线程不会退出。
似乎不使用等待和阻止最适合我的使用
如果您正在编写控制台应用程序,那么阻止就可以了。如果您正在编写winforms应用程序,则可能需要重新评估; async
对于保持UI线程空闲非常有用。
这条线实际上是Async吗?实际上开始一个新线程?
正如其他人所评论的那样,异步方法(通常)不会启动新线程。事实上,它恰恰相反:异步方法释放调用线程。是的,它是异步的。
也就是说,调用异步方法,然后立即阻止返回任务(通过调用Task<T>.Result
)是没有意义的,因为PowerShell
也有一个同步{{ 1}}方法。如果您还是要阻止,那么您也可以调用同步方法。
事实上,如果你总是阻止,为什么要使用Invoke
和async
呢?你应该只使用同步方法。
await