1

Visual Studio 2012 ulti、C#.NETWPFを使用します。

WinFormsのコードでタスクを使用するのは簡単でした。

デリゲートを作成し、コードの関数を作成し、タスクを作成するだけで、イベントはシンプルなボタンになります。簡単なもの。私が抱えている問題は次のとおりです...

  • 通常どおりスレッドを作成しますが、イベント変更されたテキストで行われます。

私が抱えている問題はロジックについて考えることです。イベントを変更するだけでは、ユーザーがコードを実行するよりも速く入力できるため、これが機能していることがわかりません(この場合はsql query selectステートメント)。そこでは、私がうまくいくとは思わない多くのタスクを実行しようとします。

基本的に、ユーザーは名前または番号でアカウントを検索するために使用されるテキストボックスを入力します。このテキストボックスでは、プロセス全体をスレッド化したいと思います。

私が考えることができる唯一の解決策は、スレッドがまだ実行されている場合にテキストが変更されるため、そのスレッドを停止して新しいスレッドを作成することですが、SQLストアドプロシージャが呼び出すので、それがクリーンな方法であるかどうかはわかりません。

それで、どんな体もこれに対する解決策を手に入れましたか?

さらに情報が必要な場合は、お問い合わせください。また、必要に応じて理解を深めるために現在機能しているコードもいくつか提供します...

Invokeメソッドを設定します。

private void SetDataGrid(bool AutoGenerateColumns, Object DataSource, String DataMember, DataGridViewAutoSizeColumnsMode Mode)
    {
        if (this.ParetoGrid.InvokeRequired)
        {
            this.ParetoGrid.Invoke(new Action<bool, Object, String, DataGridViewAutoSizeColumnsMode>(SetDataGrid),
                                      AutoGenerateColumns, DataSource, DataMember, Mode);
        }
        else
        {
            this.ParetoGrid.AutoGenerateColumns = AutoGenerateColumns;
            this.ParetoGrid.DataSource = DataSource;
            this.ParetoGrid.DataMember = DataMember;
            ParetoGrid.AutoResizeColumns(Mode);
        }
    }

別のメソッドでinvokeメソッドを呼び出します。

Private void GetSomething()
{
    //sql code get data
    SetDataGrid(true, dataSet1, "Pareto", DataGridViewAutoSizeColumnsMode.AllCells);
}

次に、イベントでタスクを開始します。

private void myButton_Click(Object sender, EventArgs e)
{
    Task t = new Task(() => getSomething());
    t.Start();
}

ご覧のとおり、単純なものですが、単純な変更イベントはロジック全体を台無しにしているようです。

4

3 に答える 3

0

この検索モードに入ると、すべてのアカウントをキャッシュできます。次に、キャッシュされたアカウントがテキストボックスにテキストを入力するときに、それらのアカウントを検索できます。キーを押すたびに異なるスレッドでクエリを実行することは、アプリにとって非常に重い作業です。

于 2013-03-26T14:07:24.437 に答える
0

このロジックをタスクからTimerコールバックに移動することをお勧めします。その後、OnTextChangedハンドラーに、タイマーが起動されるたびに実際にタイマーをリセットさせます(もちろん、タイマーは1回だけ起動します)。タイマーを0.5〜1秒後に経過させるなどして、実際にロジックを呼び出す前に、すべてのテキストが入力されるまで待機します。ただし、ユーザーエクスペリエンスは依然として非常に敏感です。

例:

private System.Threading.Timer keyEntryTimer = new Timer(Logic,null,-1,-1);

public void HandleEvent(objet sender, EventArgs args)
{
    keyEntryTimer.Change(500,-1);
}

public void Logic(objet state)
{
    //Your task logic would go here to read from the text etc... 
    //You'll have to handle any UI updates either by firing off a task once the DB results return or using a dispatcher
}
于 2013-03-26T14:09:15.640 に答える
0

私はおそらく他の提案された答えの組み合わせを行い、タイマーまたは同様の方法を使用してSQLステートメントの起動を遅らせようとしますが、ユーザーがSQLの起動に十分な時間遅延した場合は、返された結果をそのポイントフォワード(検索文字列が明らかに制限的になっている場合のみ)。これにより、コストのかかるSQLラウンドトリップを節約し、最初のヒット後に有効なキャッシュを提供できます(これは、すべてをキャッシュしようとした場合よりも小さいはずです)。

お役に立てれば。

于 2013-03-26T17:06:52.837 に答える