私は開発中のマルチスレッドC#アプリケーションを管理するためのクラスのセットを最適に設計する方法について助けが必要です。 一連のスレッドを起動するThreadContainerクラスを正常に作成しました。 スレッドは、特定のWebサイトから財務データをダウンロードします。 渡された各Webサイトについて、同じベースURLを開きますが、異なる記号で開きます。 したがって、各ウェブサイトに渡された記号の数に等しい数の結果があります。スレッドの結果を要求されたWebサイトに応じて、異なる方法で処理しているに が続いて...ここ が簡略化ThreadContainerコードです:クラスデザイン - 複数のスレッドレスポンスを管理する方法
public class ThreadContainer
{
private int ConcurrentThreads;
private string Website;
public string URL;
private Queue SymQueue;
//Constructor
public ThreadContainer(string website, Queue symQueue)
{
Website = website;
SymQueue = symQueue;
}
//Start
public void start(int concurrent)
{
ConcurrentThreads = concurrent;
//Start the Concurrent Threads
for (int ThreadNum = 1; ThreadNum <= ConcurrentThreads; ThreadNum++)
{
//Get a symbol from the queue
Sym = SymQueue.Dequeue().ToString();
//Build the URL
URL = string.Format(Constants.URL(Website), Sym);
//Create a new Asynch thread
AsynchThread j = new AsynchThread(ThreadNum);
//Start the AsyncThread class with the BackgoundWorker
j.Start(Sym, URL);
}
}
//Method called when the Backgroundworker thread has terminated
private void AsynchThread1_JobCompleted(object sender, EventArgs e)
{
// Get the AsynchThread object
AsynchThread j = (AsynchThread)sender;
//Get the symbol name
String Sym = j.Sym;
//Get the result with the Webpage content
RunWorkerCompletedEventArgs re = e as RunWorkerCompletedEventArgs;
String result = re.Result.ToString();
/* HERE EACH THREAD RETURNS THE WEBSITE CONTENT.
* DEPENDING ON THE WEBSITE THAT WAS REQUESTED SEVERAL ACTIONS MAY BE EXECUTED.
*/
switch(website)
{
case "WebsiteA":
// With WebsiteA I would like to :
// 1. extract the symbol data
// 2. return the result for this symbol to the calling class.
case "WebsiteB":
// With WebsiteB I would like to:
// 1. extract the symbol data (Webpage design is different from WebsiteA)
// 2. store each symbol data in a database table
case "WebsiteC":
// With WebsiteB I would like to:
// 1. extract the symbol data (Webpage design is different from WebsiteA and WebsiteB)
// 2. put the results in a queue
case ...
default:
return "";
}
// Reuse the thread that has just completed
//If there are items left in the queue...
if (SymQueue.Count > 0)
//...get the new Sym value...
NewSym = SymQueue.Dequeue().ToString();
//If NewSym is valid ...
if (!String.IsNullOrEmpty(NewSym))
{
//...build the URL...
String NewURL = string.Format(Constants.URL(Website), NewSym);
//...then restart the thread with the new parameters
j.Start(NewSym, NewURL);
}
}
}
私が設計するための最良の方法は何か知っていただきたいと思いますAsynchThread1_JobCompleted メソッド。 各スレッドが終了していると、次のタスクを実行する必要があるときに、このメソッドが呼び出されます。
- Webページのコンテンツ
- は、Webページ
- からデータを呼び出し元にデータを送信したり、保存抽出しますデータをDBに挿入するか、またはデータをキューに挿入します。
- キューにアイテムがまだあるかどうかを確認し、新しいURLでスレッドを再起動すると、新しいWebページが開きます。
新しいウェブサイトを追加する必要があるたびにコードを変更する必要がないように、メソッドを設計するにはどうすればよいですか? また、データを抽出するページをダウンロードした同じAsynchThreadを使用するか、DBなどに保存する必要がありますか。私はシングル責任原則の種類以下ThreadContainerクラスを持っていると思い ...
感謝のEventArgsで
対象とする.NETフレームワークのバージョンは何ですか? –
.Net version 4 – Forna
結果をキュー