ai制作一个Silverlight图像上传器,代码运行正常,但在低性能机器上,浏览器(Firefox,Chrome)会出现如下错误:插件'silverlight'没有响应!!,调整大小的方法有一个cpu成本和原因问题。
我现在需要思考:
有一种方法可以使用OpenFileDialog assync加载文件吗?
private void btnSelectFiles_Click(object sender, RoutedEventArgs e)
{
files = new List<File>();
OpenFileDialog dlg = new OpenFileDialog();
dlg.Multiselect = Parameters.multiselect;
dlg.Filter = Parameters.filter;
if (dlg.ShowDialog() == true)
{
JavaScriptHelper.Invoke("SilverUploaderDebug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - Abrindo arquivos");
foreach (var file in dlg.Files)
{
try
{
var f = new File();
JavaScriptHelper.Invoke("SilverUploaderDebug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - Abrindo " + file.Name);
JavaScriptHelper.Invoke("SilverUploaderDebug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - Redimensionando " + file.Name + "(grande)");
var stream1 = file.OpenRead();
f.data1 = ImageHelper.Resize(stream1, Parameters.img_width, Parameters.img_height, 90, f);
JavaScriptHelper.Invoke("SilverUploaderDebug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - OK");
JavaScriptHelper.Invoke("SilverUploaderDebug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - Redimensionando " + file.Name + "(pequeno)");
var stream2 = file.OpenRead();
f.data2 = ImageHelper.Resize(stream2, Parameters.img_thumb_width, Parameters.img_thumb_height, 90, f);
JavaScriptHelper.Invoke("SilverUploaderDebug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - OK");
f.name = file.Name;
f.extension = file.Extension;
files.Add(f);
JavaScriptHelper.Invoke("SilverUploaderFileLoaded",JsonHelper.SerializeToJsonString(f));
}
catch(Exception ex)
{
JavaScriptHelper.Invoke("SilverUploaderException", ex.Message);
}
}
if (Parameters.auto_upload)
upload();
}
}
答案 0 :(得分:0)
Silverlight插件“无响应”的原因是您在UI线程上运行长时间运行的操作。为什么不将图像文件(file.OpenRead()
)的实际读取和操作移动到BackgroundWorker
?我不知道你的upload
方法做了什么,希望它是好的和异步的,但你可能想要考虑这是否也是非常重要的时间。
如果您想改善用户体验,可以尝试在后台线程突然显示的同时在UI上添加“正在进行中的工作”指示。