-1

私はこのような機能を持っています:

foreach (ListViewItem item in getListViewItems(listView2)) //for proxy
{
    if (reader.Peek() == -1)
    {
        break;
    }

    lock (reader)
    {
        line = reader.ReadLine();
    }


    //proxy code
    List<string> mylist = new List<string>();
    if (item != null)
    {
        for (int s = 0; s < 3; s++)
        {
            if (item.SubItems[s].Text != null)
            {
                mylist.Add(item.SubItems[s].Text);
            }
            else
            {
                mylist.Add("");
            }
        }
    }
    else
    {
        break;
    }
    //end proxy code


    //some other code including the threadpool
}

およびデリゲート コード:

private delegate ListView.ListViewItemCollection GetItems(ListView lstview);
private ListView.ListViewItemCollection getListViewItems(ListView lstview)
{
    ListView.ListViewItemCollection temp = new ListView.ListViewItemCollection(new ListView());
    if (!lstview.InvokeRequired)
    {
        foreach (ListViewItem item in lstview.CheckedItems)
        {
            temp.Add((ListViewItem)item.Clone());
        }
        return temp;
    }
    else
    {
       return (ListView.ListViewItemCollection)this.Invoke(new GetItems(getListViewItems), new object[] { lstview });
    }
}

編集:

メイン関数の foreach ループを条件付き関数に置き換えたい:

if (reader.Peek() == -1)
{
    break;
}

lock (reader)
{
    line = reader.ReadLine();
}


if (use_proxy == true)
{
    mylist2 = get_current_proxy();
}

//some other code including the threadpool

private List<string> get_current_proxy()
{
    //what shall I add here?
}

その関数を foreach ループと同じようにするにはどうすればよいですか?ただし、for ループを使用しますか? プロキシを1つずつ取得することを意味します...

4

1 に答える 1

1

ウェブサイトをスクレイピングして電子メールを送信してからスパムを送信するというアイデアを中心に、複数の質問が寄せられています。そのための非常に優れたツールが既にあります。新しいツールは必要ありません。

とにかく - 私はあなたの質問を理解していません。ここにいるのは私だけではないようですが、何よりもまず知っておくべきことは次のとおりです。

Windows で何かを複数のスレッドで実行すると、最終的に同期する必要がInvoke()あり、すべてが 1 つのスレッドを通過するまで待機する必要があり、それがメッセージ ループを保持します。したがってListView、複数のスレッドから読み取りまたは書き込みを試みることができますが、それぞれの読み取り/書き込みを行うにはInvoke()(おそらく直接試してみて、BAAAAM) する必要があり、すべての Invoke() には通過する穴が 1 つしかありません。スレッドは順番を待つ必要があります。

次: ListView をデータのコンテナーにするのは非常に悪いので、これ以上コメントすることはできません。何かを

class MyData
{
    public string Name;
    public string URL;
    // ...
}

List<MyData> _myData;

あなたのデータを保持します。控えめな同期の問題に対処すれば、複数のスレッドからアクセスできるようになります。

最後に、構文もわからないのに、なぜ .net C# プログラミングについて質問するのでしょうか。まあ、それは修辞的です...

于 2012-04-28T16:20:23.030 に答える