2011-02-08 3 views
2

Я хочу поместить этот метод в класс рабочего класса, я пытаюсь, но застрял, Может ли кто-нибудь помочь мне, как запустить этот метод в классе рабочего класса:
Я вызываю этот метод в asp .net, где файл зацикливается на сервере, а затем возвращается к клиенту. но архивирование файла может занять больше времени, и пользователь будет видеть экран занят, поэтому, чтобы избежать, что я хочу использовать класс фона рабочего:C# Фоновый рабочий класс

[Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.ReadWrite)] 
public string Zip(string f, bool original) 
{ 
    string zip = ""; 
    try 
    { 
     files = HttpContext.Current.Server.UrlDecode(files); 
     string[] fileCollection = files.Split('*'); 
     zipFile = class1.zipfile(fileCollection, IsOriginal); 

     int fileLength = files.Length; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Exception during processing {0}", ex); 
    } 
    return File; 
} 
+2

что вы пробовали? как далеко у вас есть? [MSDN имеет пример] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) использования «BackgroundWorker» - это должен быть просто случай, когда ваш код вместо у них. Кроме того, обратите внимание, что фоновый работник * чаще используется *, чтобы избежать блокировки пользовательского интерфейса - конечно, вы можете * использовать * его с консоли, но это менее распространено. Во многих отношениях я могу просто использовать «ThreadPool» здесь ... –

+0

Ваш метод не имеет большого смысла. Во-первых, 'zip' никогда не используется. И вы возвращаете «Файл», которого нет нигде. –

+0

@ marc Gravell: Я смущен тем, как передавать аргументы методам, а также этот метод возвращает значение, поэтому я запутался в нем, – safi

ответ

3

Кажется, ваша проблема возвращается значение из BackgroundWorker. Это можно сделать так:

В методе DoWork работника, установите e.Result на то, что вы хотите, чтобы вернуться:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ... 
    e.Result = File; 
} 

Затем в методе RunWorkerCompleted, вы можете получить это значение в главном потоке :

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    string result = e.Result as string; 
} 

Я предположил, что File является строка, но вы можете бросить его на нужный объект.

Почему вам это нужно в веб-приложение, я не имею ни малейшего понятия, но это, как это сделать, по крайней мере;)

+0

Спасибо, мне нужно в веб-APP, потому что я вызываю этот метод на мою страницу asp.net, где файл заархивирован на сервере, а затем возвращается к клиенту. но смена файла может занять больше времени, если размер файла, например. 500 мб, и пользователь увидит занятую страницу, пока обработка zipping не будет завершена, а хром/мозилла не будет распознан как подозрительный скрипт, поэтому попросите пользователя убить страницу :( – safi

+0

Не было бы лучше сделать это, используя AJAX для поддерживайте реакцию клиента, в то время как сервер работает. A в AJAX означает асинхронную причину;) –

+0

@ Я уже использую ajax для этого метода: например, [Ajax.AjaxMethod (Ajax.HttpSessionStateRequirement.ReadWrite)] – safi

Смежные вопросы