0

私のウェブサイトで
1.フォームに入力した後、そのレコードをSQLデータベースに挿入します
2.次の行で、クラスオブジェクトを取得し、他のレコードとの照合に送信します
3.マッチングアプリケーションで非常に時間がかかる

今、スレッド化またはデリゲートを使用して、マッチングプロセスをバックグラウンド/非同期に配置することにしました

私の以前のコードは次のとおり
です。 1. データベースにすべての情報を挿入する

2. Matching related record with other record in database
            clsMatchMakingDAL objclsMatchMakingDAL = new clsMatchMakingDAL();
            objclsMatchMakingDAL.AcquireMatch(objAcqProvBL);  

Q 1.バックグラウンド/非同期でプロセスを実行する最良の方法はどれですか - スレッドまたはデリゲート

今私はスレッディングを使用しています:

objclsBbDAL.InsertAcquirePrvider(objAcqProvBL);
//Threading
CallMatchMakingOnDiffThread(objAcqProvBL);

private void CallMatchMakingOnDiffThread(clsAcquireProviderBL objAcqPro)
{
    clsMatchMakingDAL objclsMatchMakingDAL = new clsMatchMakingDAL();
    Thread objThread = new Thread(() => objclsMatchMakingDAL.AcquireMatch(objAcqPro));
    objThread.Start();
}

Q2. デリゲートでこのタスクを実行するにはどうすればよいですか?

4

3 に答える 3

0

デリゲートはコールバックのようなものです。非同期タスクが完了したことを通知するために使用します。つまり、スレッドはイベントを呼び出す必要があり、デリゲートがフックされている必要があります。

例えば:

public struct ThreadData
{
    public int handle;
    public string details;
    public ThreadData(int handle, string details)
    {
        this.handle = handle;
        this.details = details;
    }
}
public class ThreadWorker
{
    private List<Thread> threads = new List<Thread>();
    public int BeginAsyncWork(string details)
    {
        Thread thread = new Thread(new ParameterizedThreadStart(ThreadMethod));
        threads.Add(thread);
        thread.Start(new ThreadData(threads.Count - 1, details));
        return threads.Count - 1;
    }
    private void ThreadMethod(object parameter)
    {
        ThreadData data = (ThreadData)parameter;
        Console.WriteLine(data.details);
        if (ThreadFinished != null) { ThreadFinished(data.handle); }
    }
    public delegate void ThreadEndDelegate(int handle);
    public event ThreadEndDelegate ThreadFinished;
}
public static class Program
{
    private static int[] handles;
    public static void Main()
    {
        handles = new int[4];
        ThreadWorker worker = new ThreadWorker();
        worker.ThreadFinished += new ThreadWorker.ThreadEndDelegate(OnThreadFinished);
        for (int i = 0; i < 4; i++)
        {
            handles[i] = worker.BeginAsyncWork("working: " + i);
        }
        Console.ReadKey();
    }
    private static void OnThreadFinished(int handle)
    {
        Console.WriteLine("thread: " + handle + " finished");
        handles[handle] = 0;
    }
}

長くなりましたが、スレッドを完全に制御できます。

編集:

テストされていないコード。私が考えることができる最短の解決策。

objclsBbDAL.InsertAcquirePrvider(objAcqProvBL);
//Threading
CallMatchMakingOnDiffThread(objAcqProvBL);

private void OnMatchAcquired(object match)
{
//do work with found match
}
private event Action<object> MatchAcquired = new Action<object>(OnMatchAcquired);

private void CallMatchMakingOnDiffThread(clsAcquireProviderBL objAcqPro)
{
    clsMatchMakingDAL objclsMatchMakingDAL = new clsMatchMakingDAL();
    Thread objThread = new Thread(
() => object match = (object)objclsMatchMakingDAL.AcquireMatch(objAcqPro); if(ThreadComplete!=nil){MatchAcquired(match);}
);
    objThread.Start();
}
于 2013-07-08T09:19:33.277 に答える
0

デリゲートだけではバックグラウンド処理はできません。デリゲートは、スレッドや非同期プロセスとはまったく異なります。デリゲートは、関数へのポインターとして理解できます。スレッドはデリゲートを使用して特定の機能を実行しますが、デリゲートだけではバックグラウンドで実行することはできません。あなたが上で述べたことを行うと、バックグラウンドでプロセスが実行されますが、バックグラウンドでこのように操作を実行するためのコストを知る必要があります。また、本当にバックグラウンドで実行する必要があるのか​​、それとも最適化のみが必要なのかを知る必要があります。

于 2013-07-08T08:46:16.490 に答える
0

最も簡単な方法 (少なくとも私にとって) は、デリゲートと BeginInvoke を使用することです。これはすぐに戻り、デリゲートが終了したときに実行されるコールバックを提供できます。詳細については、MSDNを参照してください。

あなたのサンプルコードでは、操作が終了したときに通知を受ける必要があることがわかりません。そのため、次のようなことができます。

new Action(() =>
{
    clsMatchMakingDAL objclsMatchMakingDAL = new clsMatchMakingDAL();
    objclsMatchMakingDAL.AcquireMatch(objAcqPro);
}).BeginInvoke(null, null);

これにより、.Net によって管理されている別のスレッドで一致する機能が実行されます。完了時に通知を受ける必要がある場合は、BeginInvoke呼び出しの最初の引数を、完了イベントを処理する別のデリゲートにすることができます。

于 2013-07-08T11:22:20.180 に答える