Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC中完成异步任务后通知视图_C#_Asp.net_Ajax_Asp.net Mvc_Asynchronous - Fatal编程技术网

C# 在MVC中完成异步任务后通知视图

C# 在MVC中完成异步任务后通知视图,c#,asp.net,ajax,asp.net-mvc,asynchronous,C#,Asp.net,Ajax,Asp.net Mvc,Asynchronous,我有一个视图,通过ajax将数据发送到MVC中的一个动作。我只希望在任务完成时在视图中收到通知。我遇到的问题是,是在任务完成之前通知我,还是等到任务完成后才阻止查看。这是我所做工作的一个例子: function UploadFile(file) { $.ajax({ url: '/Home/Upload', type: 'POST', data: file, success: function (result) {

我有一个视图,通过ajax将数据发送到MVC中的一个动作。我只希望在任务完成时在视图中收到通知。我遇到的问题是,是在任务完成之前通知我,还是等到任务完成后才阻止查看。这是我所做工作的一个例子:

function UploadFile(file) {
    $.ajax({
        url: '/Home/Upload',
        type: 'POST',
        data: file,
        success: function (result) {
            alert(result);

        }
    });
}


[HttpPost]
public async Task<ActionResult> Upload(httpPostedFileBase file)
{
        NewFile service = new NewFile((long)Session["UserId"]);

        Thread thread = new Thread(() =>service.UploadFile(file));
        thread.Start();
        return Json("File Uploaded", JsonRequestBehavior.AllowGet);
}


    public async Task<string> UploadFile(HttpPostedFileBase file) // returns the file Id in Google Drive
    {
        Google.Apis.Drive.v3.Data.File uploadedFile = new Google.Apis.Drive.v3.Data.File();
        try
        {
            if (file != null && file.ContentLength > 0)
            {
                // Check for credentials
                Google.Apis.Drive.v3.DriveService service = Service;
                // Uploads the file to the server in "~/GoogleDriveFiles" folder.
                /*string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),*/ // TODO Doesn't work with Unit testing. Must be written manual for testing
                //Path.GetFileName(file.FileName));
                //file.SaveAs(path);
                // Save the metadata of the file
                var FileMetaData = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = Path.GetFileName(file.FileName),
                    MimeType = MimeMapping.GetMimeMapping(file.FileName),
                    Parents = new List<string>
                    {
                       GetReposFolderId()
                    }
                };
                // Create a request for upload
                Google.Apis.Drive.v3.FilesResource.CreateMediaUpload request;
                file.InputStream.Close();
                // Create a stream using the file filepath and filling the request. Then upload.
                using (var stream = new System.IO.FileStream(file.FileName, System.IO.FileMode.Open))
                {
                    request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                    request.Fields = "id";
                    await request.UploadAsync();//TODO Tuka bavi i ne mozesh da browswash prez papkite dokato ne go kachi na servara
                }
                uploadedFile = request.ResponseBody;
            }
        }
        catch (Exception ex)
        {
            ErrorEngine.RuntimeExceptions runtimeExceptions = new ErrorEngine.RuntimeExceptions();
            runtimeExceptions.ManageException(ex, this);
            return ex.ToString();
        }
        return uploadedFile.Id;
    }
函数上传文件(文件){
$.ajax({
url:“/Home/Upload”,
键入:“POST”,
数据:文件,
成功:功能(结果){
警报(结果);
}
});
}
[HttpPost]
公共异步任务上载(httpPostedFileBase文件)
{
NewFile service=newnewfile((长)会话[“UserId]”);
线程线程=新线程(()=>service.UploadFile(文件));
thread.Start();
返回Json(“上传文件”,JsonRequestBehavior.AllowGet);
}
public async Task UploadFile(HttpPostedFileBase file)//返回Google驱动器中的文件Id
{
Google.api.Drive.v3.Data.File uploadedFile=new Google.api.Drive.v3.Data.File();
尝试
{
如果(file!=null&&file.ContentLength>0)
{
//检查凭证
Google.api.Drive.v3.DriveService=service;
//将文件上载到“~/GoogleDriveFiles”文件夹中的服务器。
/*字符串path=path.Combine(HttpContext.Current.Server.MapPath(“~/GoogleDriveFiles”),*///TODO不适用于单元测试。必须为测试编写手册
//GetFileName(file.FileName));
//file.SaveAs(路径);
//保存文件的元数据
var FileMetaData=new Google.api.Drive.v3.Data.File()
{
Name=Path.GetFileName(file.FileName),
MimeType=MimeMapping.GetMimeMapping(file.FileName),
父母=新名单
{
GetReposFolderId()
}
};
//创建上传请求
Google.API.Drive.v3.FileResource.CreateMediaUpload请求;
file.InputStream.Close();
//使用文件路径创建流并填充请求。然后上载。
使用(var stream=new System.IO.FileStream(file.FileName,System.IO.FileMode.Open))
{
request=service.Files.Create(FileMetaData、stream、FileMetaData.MimeType);
request.Fields=“id”;
wait request.UploadAsync();//TODO Tuka bavi在mozesh da browswash prez papkite dokato ne go kachi na servara
}
uploadedFile=request.ResponseBody;
}
}
捕获(例外情况除外)
{
ErrorEngine.RuntimeExceptions RuntimeExceptions=新的ErrorEngine.RuntimeExceptions();
ManageException(例如,this);
返回例如ToString();
}
返回uploadedFile.Id;
}
正如你可能认为的那样,我在MVC和编码方面不是很有经验。你能帮我吗?

试试这个:

[HttpPost]
public async Task<JsonResult> Upload(httpPostedFileBase file)
{
    try {
        NewFile service = new NewFile((long)Session["UserId"]);
        await Task.Run(() => service.UploadFile(file));
    } catch (Exception e) {
        Console.WriteLine(e);
    }

    return Json("File Uploaded", JsonRequestBehavior.AllowGet);
}
[HttpPost]
公共异步任务上载(httpPostedFileBase文件)
{
试一试{
NewFile service=newnewfile((长)会话[“UserId]”);
wait Task.Run(()=>service.UploadFile(文件));
}捕获(例外e){
控制台写入线(e);
}
返回Json(“上传文件”,JsonRequestBehavior.AllowGet);
}

简而言之,你不能

如果您不想等待处理。。。那它永远不会知道

除非

您可以使用轮询器每x次询问一次,也可以使用双向通信。。。。这是相当多的编码,但您可以查看信号,然后您可以发出消息,所有侦听都可以接收

所以最简单的。。。。为你。。。是将文件作为一个请求上传,并等待响应

上传和做什么的动作可以分开,这是许多网站所做的。。你可以使用js,有一个进度条来显示文件上传到服务器的距离。但是,除非你等待,否则除了我上面所说的或其他版本之外,没有其他方法

选项有轮询器套接字基础技术,或只需等待上传到并完成处理


上传和处理可以是具有不同响应的单独调用,这是大多数站点所做的…

除非您正在编写自定义线程调度程序,否则您永远不应该调用
新线程(…)
。您应该使用
任务。改为运行(…)
。您的代码将无法编译。您在等待之外没有返回声明。另外,使用Task.Run调用
新线程(…).Start()
有点没用。是的,我明白你关于任务的意思。Run但这不会改变当线程或任务完成时,我在视图中没有收到通知。在任务完成之前,我在ajax请求中触发success函数。我需要的是在任务完成后获得通知,而不会在过程中阻塞视图。Julian-我编辑了我的答案,但没有看到您的完整设置,我正在做几个假设,主要是您的文件上载任务是同步的,并且作为一个单独的服务工作。如果是这样的话,那么将其包装到任务中。Run应该可以工作,并在完成时通知您。Keith-当我将其放入等待任务中时。Run()在上传文件之前,Veiw将被阻止。如果文件很大,可能需要相当长的时间。如果我在未等待视图未被阻止的情况下将其放置,则文件将在后台上载,但在上载文件时,我不会收到任何通知,因为ajax请求中的成功函数是在上载完成之前触发的。我想在上传完成时得到通知,而不阻塞视图