C# “我怎样才能回来”;“好的”;无需等待内部方法完成即可立即执行

C# “我怎样才能回来”;“好的”;无需等待内部方法完成即可立即执行,c#,asynchronous,C#,Asynchronous,我需要实现一个方法,该方法不希望对另一个方法的调用返回OK。如何做到这一点 我尝试使用'wait',但此等待结束返回“OK” 对方法的调用,该方法立即返回一个OK,通知文件的接收。在后台,被调用的方法将一直工作到完成,并且在完成时不会返回任何内容。如果要派生一个新的异步任务。此示例使用static Task.Run并传入匿名异步任务。对Task.Run()的调用是同步执行的,但Task.Run()中匿名任务的执行不是同步执行的,它完成得如此之快 using System.Threading.Ta

我需要实现一个方法,该方法不希望对另一个方法的调用返回OK。如何做到这一点

我尝试使用'wait',但此等待结束返回“OK”


对方法的调用,该方法立即返回一个OK,通知文件的接收。在后台,被调用的方法将一直工作到完成,并且在完成时不会返回任何内容。

如果要派生一个新的异步任务。此示例使用static Task.Run并传入匿名异步任务。对Task.Run()的调用是同步执行的,但Task.Run()中匿名任务的执行不是同步执行的,它完成得如此之快

using System.Threading.Tasks;

[WebMethod] //WebServiceMethod
public string ImportaDadosPosLeilaoValores(string fileName)
{
    // this call may take several minutes and should NOT be expected
    Task.Run(() => {
        ImportaDados(fileName);
    }); 
    return "OK - Received";     // immediately
}
我不熟悉[WebMethod]的来源,但您可能希望完全异步。在本例中,您的调用和被调用方法是异步的,并且不等待被调用的任务,这将按照您想要的方式执行

using System.Threading.Tasks;

[WebMethod] //WebServiceMethod
public async Task<string> ImportaDadosPosLeilaoValores(string fileName)
{
    // this call may take several minutes and should NOT be expected
    ImportaDados(fileName);
    return "OK - Received";     // immediately
}

public async Task ImportaDados(string filename)
{

}
使用System.Threading.Tasks;
[WebMethod]//WebServiceMethod
公共异步任务IMPORTADADOSPOLEILAOVALERES(字符串文件名)
{
//此呼叫可能需要几分钟时间,不应出现这种情况
ImportaDados(文件名);
返回“OK-Received”;//立即
}
公共异步任务ImportaDados(字符串文件名)
{
}

任务在线程上运行,并由管理每个任务的同步状态的计划程序执行。除非有特定的理由,否则不要直接使用线程

嗯,没问题吧?好。请继续你的练习。还要注意,当前的代码示例存在无限递归,在调用时基本上会导致堆栈溢出(双关语)……好消息是,这可能不会花费几分钟时间。请查看System.Threading命名空间。您应该能够生成一个新线程来运行
ImportaDados
。文件上载应该将文件放到文件共享或某个存储位置。构建一个小型控制台应用程序,监控该位置并对其进行反应和处理。长时间运行的处理作业不属于web服务器应用程序。您只是在长时间使用线程,并引入了一个可被利用的漏洞。如果作业运行很长时间,我可以向您发送垃圾邮件(除非您有保护),并耗尽您的线程池。
Task.Run(async()
异步有必要吗?它有什么作用?@mmmaxwwell在第一个
任务中没有理由使用
异步
。运行
-任务
。运行
是创建将在线程池上执行的新任务的功能。如果没有
等待
,则不需要
异步
。这一行将生成CS1998警告-
using System.Threading.Tasks;

[WebMethod] //WebServiceMethod
public async Task<string> ImportaDadosPosLeilaoValores(string fileName)
{
    // this call may take several minutes and should NOT be expected
    ImportaDados(fileName);
    return "OK - Received";     // immediately
}

public async Task ImportaDados(string filename)
{

}