質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

解決済

C#でsync(非同期)で取得した文字列をFormのtextboxに書き込みたい。

saki1214
saki1214

総合スコア35

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

3回答

0評価

0クリップ

233閲覧

投稿2022/08/03 09:32

前提

C#でYoutubeライブのチャットコメントを取得し、Formのtextboxに書き込みたい。
Youtubeライブのチャットコメントは参考記事を使っているが、async(非同期)で書かれている。
チャットコメントは取得できている。

実現したい

C#でsync(非同期)で取得した文字列をFormのtextboxに書き込みたい。

発生している問題・エラーメッセージ

debugモードで変数の中身を見ていると、コメントは取得できているが、textboxに出力されない。

該当のソースコード

参考 https://qiita.com/MCK9595/items/fdbd543ff938febcd136

C#

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using System.IO.Ports; using Google.Apis.Services; using Google.Apis.YouTube.v3; namespace YoutuveLive { public partial class Form1 : Form { public Form1() { InitializeComponent(); } const string APIKey_ = "XXXXXXXXXXXXXXXXXXXXXXXX"; private static Form1 f1; private async void button2_Click(object sender, EventArgs e) { await MainStart(); } private void Form1_Load(object sender, EventArgs e) { } static async Task MainStart() { f1 = new Form1(); var youtubeService = new YouTubeService(new BaseClientService.Initializer() { ApiKey = APIKey_ }); string MOVIE_ID = f1.textBoxMovieID.Text; string liveChatId = GetliveChatID(MOVIE_ID, youtubeService); while (liveChatId == null || liveChatId == "") { liveChatId = GetliveChatID(MOVIE_ID, youtubeService); } await GetLiveChatMessage(liveChatId, youtubeService, null); } static public string GetliveChatID(string videoId, YouTubeService youtubeService) { //引数で取得したい情報を指定 var videosList = youtubeService.Videos.List("LiveStreamingDetails"); videosList.Id = videoId; //動画情報の取得 var videoListResponse = videosList.Execute(); //LiveChatIDを返す foreach (var videoID in videoListResponse.Items) { return videoID.LiveStreamingDetails.ActiveLiveChatId; } //動画情報取得できない場合はnullを返す return null; } static public async Task GetLiveChatMessage(string liveChatId, YouTubeService youtubeService, string nextPageToken) { f1 = new Form1(); var liveChatRequest = youtubeService.LiveChatMessages.List(liveChatId, "snippet,authorDetails"); liveChatRequest.PageToken = nextPageToken; var liveChatResponse = await liveChatRequest.ExecuteAsync(); foreach (var liveChat in liveChatResponse.Items) { try { await Task.Run(() => { f1.textBoxLog.AppendText(liveChat.Snippet.DisplayMessage + liveChat.AuthorDetails.DisplayName + System.Environment.NewLine); }); } catch { } } await Task.Delay((int)liveChatResponse.PollingIntervalMillis); await GetLiveChatMessage(liveChatId, youtubeService, liveChatResponse.NextPageToken); } }//class }//namespace

試したこと

async(非同期)を使っているときに、単純にはFormへアクセスできない、ということはわかり、以下のような方法を試しました。

//Errorは出ないが出力はされない f1 = new Form1(); await Task.Run(() => { f1.textBoxLog.AppendText(liveChat.Snippet.DisplayMessage liveChat.AuthorDetails.DisplayName + System.Environment.NewLine); });
//Invokeにたいして、オブジェクト参照が必要です、のError await Task.Run(() => { Invoke(new Action(() => { //Invokeメソッド内ではUIスレッドに戻してくれる f1.textBoxLog.AppendText(liveChat.Snippet.DisplayMessage + liveChat.AuthorDetails.DisplayName + System.Environment.NewLine); })); });

補足情報(FW/ツールのバージョンなど)

C#、Visualstudio

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

YAmaGNZ

2022/08/03 10:46

本質問とは直接関係ありませんが、Form1のインスタンスがどうなっているか理解されたほうがよろしいかと思います。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。