Task.Factory.FromAsync的此实现是否实际运行异步

时间:2015-10-02 16:34:35

标签: c# .net powershell async-await

我从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;

    }

1 个答案:

答案 0 :(得分:3)

  

我从WinForm测试过,因为我听说Console应用程序存在异步内容

用于读取到控制台控制台 API没有正确使用异步实现,但这不会影响任何实现其他API。异步控制台唯一的另一个问题是你必须有一个顶级阻塞调用,所以主线程不会退出。

  

似乎不使用等待和阻止最适合我的使用

如果您正在编写控制台应用程序,那么阻止就可以了。如果您正在编写winforms应用程序,则可能需要重新评估; async对于保持UI线程空闲非常有用。

  

这条线实际上是Async吗?实际上开始一个新线程?

正如其他人所评论的那样,异步方法(通常)不会启动新线程。事实上,它恰恰相反:异步方法释放调用线程。是的,它是异步的。

也就是说,调用异步方法,然后立即阻止返回任务(通过调用Task<T>.Result)是没有意义的,因为PowerShell也有一个同步{{ 1}}方法。如果您还是要阻止,那么您也可以调用同步方法。

事实上,如果你总是阻止,为什么要使用Invokeasync呢?你应该只使用同步方法。

await