1

音声で使える議題を作成中です。さらに、フィードバックを提供し、毎日のリズムを取得して維持するための AI を備えた仮想アシスタント (VA) があります。

状況は、パブリックな静的リストの議題を持っているということです。

Agenda は、現在 9 つの異なる Agenda タイプを持つ抽象クラスです。これはプログラムのデータコアです。これには、プログラムが知る必要があるすべてが含まれています。

メイン スレッドには GUI が含まれており、アジェンダに期待されるユーザビリティが提供されます。

仮想アシスタントが行う必要があることはすべて、別のスレッドで実行されることです。これは主にアジェンダをチェックし、人々がアジェンダで何かをしたい場合は質問をすることです。

難しいのは、毎日の食事など、特定のロジック (いわば AI の追加) から議題に追加したい場合です。これは VA スレッドからのものですが、そこから Agenda.agenda を変更できず、コレクションが変更されたというエラーが表示されます。

ロックしてみましたが変わりません。

今日に食事を追加する:

    public void Meal()
    {
        DateTime date = DateTime.Now;

        DateTime morning = date;
        morning = morning.ChangeTime(8, 0, 0, 0);

        DateTime afternoon = date;
        afternoon = afternoon.ChangeTime(12, 0, 0, 0);

        DateTime evening = date;
        evening = evening.ChangeTime(16, 30, 0, 0);

        if (!meal && date.Hour < 21)
        {
            if(date.DayOfWeek == DayOfWeek.Wednesday)
                toAdd.Add(new Task("broodbuffet", morning, new Dictionary<DateTime, bool>()));
            else
                toAdd.Add(new Task("ontbijt", morning, new Dictionary<DateTime, bool>()));
            toAdd.Add(new Task("lunch", afternoon, new Dictionary<DateTime, bool>()));
            toAdd.Add(new Task("diner", evening, new Dictionary<DateTime, bool>()));

            meal = true;
        }

        if (date.Hour > 22)
            meal = false;
    }

VAで基本を行うクラスで:

ai.Meal();
UpdateAgenda();

スレッドで更新するメソッド:

private void UpdateAgenda()
    {
        if (ai.GetToAdd().Count != 0)
        {
            Agenda.agenda.AddRange(ai.GetToAdd());
        }
    }

そしてロック付き:

private void UpdateAgenda()
    {
        if (ai.GetToAdd().Count != 0)
        {
            lock (Agenda.agenda)
            {
                Agenda.agenda.AddRange(ai.GetToAdd());
            }
        }
    }

要するに、VA スレッドから私の議題に議題項目を追加する方法は?

4

2 に答える 2

0

あなたはロックで正しい軌道に乗っていますが、プロパティを変更するときだけロックすることはできません。

ロックはプロパティをロックするのではなく、コードをロックするため、プロパティを変更するコードがプロパティから読み取るコードをロックアウトできるように、プロパティを使用するすべてのコードをロックする必要があります。

于 2012-06-14T14:16:52.543 に答える
0

具体的には、取得したエラー (「コレクションが変更されました」) に対して、foreach ループを使用して Agenda オブジェクト内の任意のコレクションを反復処理している可能性があります。コレクションが foreach ループ内で (この場合は別のスレッドによって) 変更されると、IEnumerator.MoveNext はまさにそのようなエラーをスローします。これが問題である場合は、foreach ループ全体をロックする必要があります。

于 2012-06-15T04:38:56.873 に答える