0

フォームアプリケーションで複数のスレッドを開始して、サイトからソースコードを並行してダウンロードしたいと思います。

これは、メインアプリケーションの一部にすぎません。

写真へのリンク:http
://www.abload.de/img/pic9aym7.png 画像を投稿することは許可されていません。

    private void buttonstart_Click(object sender, EventArgs e)
    {
         //check the list below
    }

    private void buttonabort_Click(object sender, EventArgs e)
    {
         //should always could abort the process/threads. (close all webcontrols ect)
    }
  1. ボックス内の数値の読み取りを開始する必要があります。
  2. 番号ごとに、webbrowserまたはhttpwebrequestを開いて、ソースコードをダウンロードし、実行回数をカウントする必要があります(この例では4回の実行)。
    したがって、Webサイトが「http://www.bla.com/」のような場合は、変数の最後に実行を追加する必要があります(http://www.bla.com/1-4)。
  3. ソースを別の文字列に解析します。(strWebsiteString1、strWebsiteString2など。後で必要になります)

  4. それが行われる場合、それは(文字列から)いくつかのテーブルを読み取り、それらを配列に解析する必要があります。(ここでもarray1 [3]、array2 [3]、将来の使用のために)
    テーブルを取得するには、htmlagilitypackを使用すると思います。私はすでにこのhtmlagilitythingをコンソール用にコーディングしました。フォームアプリケーション用に再構築し、コンソールの書き込み行を変更していくつかの配列に配置する必要があります。

    しかし、私は他の/より良い解決策を受け入れています。

  5. 配列に解析したすべてのデータがdatagridcolumnsに表示されるはずです。実行ごとに独自の行が取得されます。しかし、comboboxcolumnにアイテムを追加しようとすると、すべてのcomboboxcolumnでエラーが発生します。
  6. それらを正しい順序で取得し、それがどのブラウザーデータからのものであるかを知るために、column1は実行回数を取得します。

私はすでに自分で試しました。私はスレッドとクロススレッドで立ち往生しています。そして、datagridviewも多くの問題を引き起こします。

お願いをして、この問題を解決するのを手伝ってください。私に役立つスニペット/サンプルを見せてください。

4

1 に答える 1

0

これは、上記のコメントで私が述べたことを示す明確な例です。Mutexの代わりにロックを使用しますが、要点はわかります。これは、マルチスレッドのジョブプロデューサーを使用してすべて同じ(ロックされた)リソースに情報を追加し、1秒に1回実行して、フォームコントロール(この場合はListBox)と対話し、ジョブキャッシュをクリアする単純なコードです。

詳細については、http://www.albahari.com/threading/part2.aspxを参照してください。

public partial class Form1 : Form
{
    static readonly Queue<Job> queue = new Queue<Job>();

    public Form1()
    {
        InitializeComponent();
        //starts the timer to run the ProcessJobs() method every second
        System.Threading.Timer t = new System.Threading.Timer(obj => { ProcessJobs(); }, null, 5000, 1000);                
    }               

    /// <summary>
    /// Called by informations producers to add jobs to the common queue
    /// </summary>        
    private void AddJob(Job job)
    {
        lock (queue)
        {
            queue.Enqueue(job);
        }
    }

    /// <summary>
    /// Common queue processing by the consumer
    /// </summary>
    private void ProcessJobs() {            
        Job[] jobs;
        lock (queue)
        {
            jobs = queue.ToArray();
            queue.Clear();
        }
        foreach(Job job in jobs){       
            this.Invoke(new Action(delegate {
                listBox1.Items.Add(job.Name);
            }));
        }
    }

    /// <summary>
    /// Producer
    /// </summary>        
    private void JobsProducer(string name) {
        for (int i = 0; i < 10; i++)
        {
            Random r = new Random();
            System.Threading.Thread.Sleep(r.Next(1,10)*50);
            this.AddJob(new Job(string.Format("Job({0}) n.{1}", name, i)));
        }
    }

    /// <summary>
    /// Starts the jobs producers
    /// </summary>        
    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 10; i++)
        {
            string producerName = string.Format("Producer{0}", i);
            new System.Threading.Timer(obj => { JobsProducer(producerName); }, null, 0, System.Threading.Timeout.Infinite);
        }
    }       
}

public class Job
{
    //whatever -informations you need to exchange between producer and consumer
    private string name;
    public string Name { get { return name; } }
    public Job(string name) {
        this.name = name;
    }
}  

そして、ここでは、辞書を使用していくつかのジョブの結果を保持する例を見つけることができます。

Dictionary<string, string[]> jobs = new Dictionary<string, string[]>();
//adds an array to the dictionary
//NB: (array it's not well suited if you don't know the values or the size in advance...you should use a List<string>)
jobs.Add("jobNumber1", new string[]{"a","b"});
//gets an array from the dictionary
string[] jobNumber1;
if (!jobs.TryGetValue("jobNumber1", out jobNumber1))
     throw new ApplicationException("Couldn't find the specified job in the dictionary"); 
于 2012-07-28T13:03:09.243 に答える