C# ManualResetEvent.WaitOne始终挂起在ASP.NET MVC中
我使用远程云服务器来存储我的图像。如果我使用控制台来执行这些代码,它工作得很好,但在asp.net mvc中,它总是挂在“WaitOne()”上 actionresult看起来是这样的,如果我使用普通的actionresult,就会发生错误,所以我必须使用TaskC# ManualResetEvent.WaitOne始终挂起在ASP.NET MVC中,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我使用远程云服务器来存储我的图像。如果我使用控制台来执行这些代码,它工作得很好,但在asp.net mvc中,它总是挂在“WaitOne()”上 actionresult看起来是这样的,如果我使用普通的actionresult,就会发生错误,所以我必须使用Task public Task<ActionResult> TestUpload() { var s = UploadUtil.UploadBase64("kmsfan", @"D:\\b.jpg"
public Task<ActionResult> TestUpload()
{
var s = UploadUtil.UploadBase64("kmsfan", @"D:\\b.jpg");
return null;
}
公共任务TestUpload()
{
var s=UploadUtil.UploadBase64(“kmsfan”,“D:\\b.jpg”);
返回null;
}
如果上载失败,您的ManualReset事件将永远不会收到信号。您应该避免在服务器环境中阻塞同步代码
使用来表示异步上载任务:
public class UploadUtil
{
public static Task<string> UploadBase64Async(string bucket,string filelocation)
{
var tcs = new TaskCompletionSource<string>();
qiniu.Config.InitFromAppConfig();
string qiniuKey = Guid.NewGuid().ToString();
jpegToBase64 jpeg = new jpegToBase64(filelocation);
QiniuFile qfile = new QiniuFile(bucket, qiniuKey);
qfile.UploadCompleted += (sender, e) => {
var returnUrl = e.RawString;
Console.Write(returnUrl);
tcs.SetResult(returnUrl);
};
qfile.UploadFailed += (sender, e) => {
QiniuWebException qe = (QiniuWebException)e.Error;
Console.WriteLine(qe.Error.ToString());
tcs.SetException(qe);
};
qfile.UploadString((int)jpeg.Filesize, "image/png", jpeg.Base64Content);
return tcs.Task;
}
}
public类UploadUtil
{
公共静态任务UploadBase64Async(字符串存储桶、字符串文件位置)
{
var tcs=new TaskCompletionSource();
qiniu.Config.InitFromAppConfig();
字符串qiniuKey=Guid.NewGuid().ToString();
jpegToBase64 jpeg=新的jpegToBase64(文件位置);
QiniuFile qfile=新的QiniuFile(bucket,qiniuKey);
qfile.UploadCompleted+=(发件人,e)=>{
var returnUrl=e.RawString;
Console.Write(返回URL);
tcs.SetResult(返回URL);
};
qfile.UploadFailed+=(发送方,e)=>{
QiniuWebException qe=(QiniuWebException)e.Error;
Console.WriteLine(qe.Error.ToString());
设置异常(qe);
};
qfile.UploadString((int)jpeg.Filesize,“image/png”,jpeg.Base64Content);
返回tcs.Task;
}
}
控制器:
public async Task<string> TestUpload()
{
var s = await UploadUtil.UploadBase64Async("kmsfan", @"D:\\b.jpg");
return s;
}
public异步任务TestUpload()
{
var s=await UploadUtil.UploadBase64Async(“kmsfan”,@“D:\\b.jpg”);
返回s;
}
如果上载失败,您的ManualReset事件将永远不会收到信号。您应该避免在服务器环境中阻塞同步代码
使用来表示异步上载任务:
public class UploadUtil
{
public static Task<string> UploadBase64Async(string bucket,string filelocation)
{
var tcs = new TaskCompletionSource<string>();
qiniu.Config.InitFromAppConfig();
string qiniuKey = Guid.NewGuid().ToString();
jpegToBase64 jpeg = new jpegToBase64(filelocation);
QiniuFile qfile = new QiniuFile(bucket, qiniuKey);
qfile.UploadCompleted += (sender, e) => {
var returnUrl = e.RawString;
Console.Write(returnUrl);
tcs.SetResult(returnUrl);
};
qfile.UploadFailed += (sender, e) => {
QiniuWebException qe = (QiniuWebException)e.Error;
Console.WriteLine(qe.Error.ToString());
tcs.SetException(qe);
};
qfile.UploadString((int)jpeg.Filesize, "image/png", jpeg.Base64Content);
return tcs.Task;
}
}
public类UploadUtil
{
公共静态任务UploadBase64Async(字符串存储桶、字符串文件位置)
{
var tcs=new TaskCompletionSource();
qiniu.Config.InitFromAppConfig();
字符串qiniuKey=Guid.NewGuid().ToString();
jpegToBase64 jpeg=新的jpegToBase64(文件位置);
QiniuFile qfile=新的QiniuFile(bucket,qiniuKey);
qfile.UploadCompleted+=(发件人,e)=>{
var returnUrl=e.RawString;
Console.Write(返回URL);
tcs.SetResult(返回URL);
};
qfile.UploadFailed+=(发送方,e)=>{
QiniuWebException qe=(QiniuWebException)e.Error;
Console.WriteLine(qe.Error.ToString());
设置异常(qe);
};
qfile.UploadString((int)jpeg.Filesize,“image/png”,jpeg.Base64Content);
返回tcs.Task;
}
}
控制器:
public async Task<string> TestUpload()
{
var s = await UploadUtil.UploadBase64Async("kmsfan", @"D:\\b.jpg");
return s;
}
public异步任务TestUpload()
{
var s=await UploadUtil.UploadBase64Async(“kmsfan”,@“D:\\b.jpg”);
返回s;
}
阻止代码在Web服务器上没有位置,会很快导致扩展问题。使用TaskCompletionSource
替代MRE并等待其Task
在这里更可取。@spender您好,您能给我看一下代码吗?因为我不熟悉您的解释。您正在阻止同步上下文,从而导致死锁,请使用async wait
进行MVC调用,这不会导致死锁控制器中的方法不是异步的,不应返回任务。。。无效返回类型。阻止代码在Web服务器上没有位置,并且会很快导致扩展问题。使用TaskCompletionSource
替代MRE并等待其Task
在这里更可取。@spender您好,您能给我看一下代码吗?因为我不熟悉您的解释。您正在阻止同步上下文,从而导致死锁,请使用async wait
进行MVC调用,这不会导致死锁控制器中的方法不是异步的,不应返回任务。。。无效返回类型。您没有异步版本的UploadCompleted
事件吗,这将使implement@Guillaume从.Net 4.5开始,Task.FromResult将不再是Task.FromResult
,这是一个比TaskCompletionSource
更好的选择,我认为Task.FromResult在这里不起作用。Task.FromRresult在您已经获得结果(同步)时非常有用,这里的任务是异步的。我已经检查过它确实可以使用Task.FromResult
和Task.FromException
直接替换,这是从.Net 4.5开始引入的,比TaskCompletionSource
更有效,就像模拟异步API一样,这也是不正确的-var tcs=new TaskCompletionSource()
,导致编译问题,应该是var tcs=new TaskCompletionSource()
您没有异步版本的UploadCompleted
事件吗,这将使它更简单implement@Guillaume从.Net 4.5开始,Task.FromResult将不再是Task.FromResult
,这是一个比TaskCompletionSource
更好的选择,我认为Task.FromResult在这里不起作用。Task.FromRresult在您已经获得结果(同步)时非常有用,这里的任务是异步的。我已经检查过它确实可以使用Task.FromResult
和Task.FromException
直接替换,这是从.Net 4.5开始引入的,比TaskCompletionSource
更有效,就像模拟异步API一样,这也是不正确的-var tcs=new TaskCompletionSource()
,导致编译问题,应该是var tcs=new TaskCompletionSource()