0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

高専キャリアとマイクロソフトがコラボしたクラウドAI開発講座進捗報告[6]

Last updated at Posted at 2020-08-10

クラウドAI開発講座進捗報告- 6週目

これの続き

作りたいものに向けてひたすらコーディング。

やったこと

やったことといってもひたすらコーディングなので今回は主に詰まったところについて各
image.png

1. BotHandler一回ごとに新しいインスタンスで処理されていた件

これ全然気づかなくてうーんってなってた。
サンプルのBotHandlerクラスの一つのインスタンスの各メソッドがActivityごとに呼び出されていると思ってた。
でも実際はイベントが発生するたびに新しいインスタンスが生成されそのインスタンス内のメソッドが呼び出されていた。つまり何が困るかというと下のようなコードがあったとき、

public class BotHandler : ActivityHandler
{
  public int count =0;
  protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
  {
     count += 1;//messageを受け取ったときにcountを1増やす
     Debug.WriteLine(count);//カウントを表示する
  }
}

出力は

1
1
1
1

というように何度メッセージを受け取っても1から変化しない。
この原因は SampleのBotHandlerクラスが実はメッセージが読み込まれるたびに新しいインスタンスを生成していたからなのです(これ気付くまでめっちゃ時間かかった)

たぶん正しい解決法はDBにデータを保管しておくことだと思うんだけど絶対に面倒くさくてやりたくない、、、、

というわけでstaticパワーで力押しする作戦をとる。

クラスをstaticにするとインスタンスを作らなくても、値を呼び出したり更新したりできるのでBotHandlerが毎回新しいインスタンスで作られたとしても関係なく情報を保持できる。
コードで書くならまずcounterクラスみたいなクラスを適当に作って、

public static class Counter
{
  private static int count = 0;
  public static void addCountOne()
  {
    count += 1;
  }
 public static int getCount()
  {
    return count;
  }
}

BotHandlerではstaticメソッドを呼び出すだけ

public class BotHandler : ActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
     Counter.addCountOne(); //messageを受け取ったときにcountを1増やす
     Debug.WriteLine(count);//コンソールにprint
}

出力は

1
2
3
4

みたいな感じなるはず!(実際に実行して確かめたわけじゃないので確かめてみてください)

それもめんどくさかったら一つ目のコードの
public int count =0;の部分をpublic static int count = 0にすればたぶん正しくカウントされる。これでもいいなって後で思いついたので追記。

2.ちょくちょく公式ドキュメント間違っている件

前から気になってたんですけどちょくちょく公式ドキュメント間違ってません?
例えばTranslatorの記事のこの部分。image.png
あと何個かあったけどメモし忘れてた。
うーんという感じ。

感想

 1. Teamsへのアップロードで面倒な工程はすべて終わったはずなので、あとはコーディングを進めるだけ!のはずなんだけど、teamsで画像アップできるのか若干怪しい

来週の予定

ひたすらコーディング、ある程度かけてきたらコード解説記事を書きたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?