gpt4 book ai didi

c# - Task.Factory.FromAsync 的这个实现实际上运行异步吗

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:01 29 4
gpt4 key购买 nike

我从 WinForm 进行了测试,因为我听说控制台应用程序在 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 和 blocking 最适合我的使用..

        //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 实现。所以这一行实际上是异步的吗?实际上开始一个新线程?

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;

}

最佳答案

I tested from a WinForm since I heard Console apps lie about async stuff

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

It appears that not using await and blocking is best for my use

如果您正在编写控制台应用程序,那么阻塞是可以的。如果您正在编写 winforms 应用程序,您可能需要重新评估这一点; async有助于保持 UI 线程空闲。

So is this line actually Async? ACTUALLY STARTING a new thread?

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

也就是说,调用异步方法然后立即阻塞返回的任务(通过调用 Task<T>.Result )是毫无意义的,因为 PowerShell还有同步Invoke方法。如果你无论如何都要阻塞,那么你也可以调用同步方法。

事实上,如果你总是阻塞,为什么要使用 asyncawait在所有?您应该只使用同步方法。

public PSDataCollection<PSObject> TestFifteenSub(string p_scriptText)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(p_scriptText);
return ps.Invoke();
}

public List<PSObject> TestFifteen(string pStrFullFilePathFileNm)
{
PSDataCollection<PSObject> retval = null;
List<PSObject> lstPsObjs = null;

retval = TestFifteenSub(pStrFullFilePathFileNm);
lstPsObjs = retval.ToList();

return lstPsObjs;
}

关于c# - Task.Factory.FromAsync 的这个实现实际上运行异步吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32911794/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com