2011-02-08 11 views
2

私は、バックグラウンドワーカークラスにこのメソッドを置きたい、私がしようとしたが立ち往生、 ていますいずれかのバックグラウンドワーカークラスにこのメソッドを実行する方法を私を助けることができます。
私は私のASPには、このメソッドを呼び出しています.netページ。ファイルはサーバー上で圧縮され、クライアントにreturendされます。しかし、ファイルを圧縮すると、私は、バックグラウンドワーカークラスを使用することを避けるために、時間がかかることがあり、ユーザーが忙しいの画面が表示されます。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

はあなたが何をしようとしている);

は、なぜ私は見当がつかないのWebアプリケーションでそれを必要とするが、これは、少なくともそれを行う方法ですか?あなたはどれくらいの距離を持っていますか? 'BackgroundWorker'を使用している[MSDNには例があります](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) - これは単純に、あなたのコードをそれらの。また、バックグラウンドワーカーはUIをブロックするのを避けるために*より一般的に使用されます*確かに、コンソールから*使用することはできますが、これはあまり一般的ではありません。多くの意味で、私はここで 'ThreadPool'を使うかもしれません... –

+0

あなたのメソッドはあまり意味がありません。まず、 'zip'は決して使用されません。そして、あなたはどこにも存在しない 'File'を返しています。 –

+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

ありがとう、私はこのファイルをサーバー上で圧縮してからクライアントにreturendするasp.netページにこのメソッドを呼び出すので、Web APPで必要です。ファイルのサイズが例えば500MBの場合は、ファイルの圧縮が長くかかることがあります。 500 MBの場合、zipの処理が完了してchrome/mozillaが実行中のスクリプトとして認識されるまで、ビジー状態のページが表示されるので、ユーザーにページを殺すように依頼してください:( – safi

+0

AJAXを使用して) –

+0

@このメソッドで既にajaxを使用しています: [Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.ReadWrite)]このメソッドでは、すでにAjaxを使用しています。 – safi