Windows.Devices.SmartCards.SmartCardReader.FromIdAsync(string deviceId)メソッドを呼ぶとExeプロセスの終了が遅延する

HOSHI-1618 20 評価のポイント
2024-03-27T15:17:52.2166667+00:00

ICカードを読み取るWindowsアプリケーション(exe)を作成しています。

スマートカードリーダーオブジェクトを取得するため、Windows.Devices.SmartCards.SmartCardReader.FromIdAsync(string deviceId)メソッドを使用しています。

しかし、本メソッドを使用するとWindowsアプリケーションの終了(Environment.Exit()メソッド実行)から20秒程度exeのプロセスが残存します。

Windowsアプリケーションが終了した時点でプロセスが終了するようにしたいのですが、解決策をご教示ください。

環境

OS:Windows10

対象のフレームワーク:.NET Framework 4.8

出力の種類:Windowsアプリケーション

参考リンク

・SmartCardReader.FromIdAsync(String) メソッド

https://learn.microsoft.com/ja-jp/uwp/api/windows.devices.smartcards.smartcardreader.fromidasync?view=winrt-22621

Windows 10
Windows 10
パーソナル コンピューターとタブレットで実行される Microsoft オペレーティング システム。
48 件の質問
.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
29 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 6,686 評価のポイント MVP
    2024-03-28T14:50:45.9533333+00:00

    20秒ぴったりかかっているので、何かの処理がタイムアウトするまでプロセスが残っているのかも。

    まぁ、対症療法が許容されるなら、プログラムの最後に自プロセスを強制的に終わらせればすぐに消えます。
    それがダメならwinscard.hにあるAPIを使えばよいかも。(こっちは試してません)

    namespace SmartCardTest
    {
        using System;
    
        public partial class App : System.Windows.Application
        {
            // App.xamlのビルドアクションをPageに変更しておく
            [System.STAThread]
            public static void Main()
            {
                App app = new App();
                app.InitializeComponent();
                app.Run();
    
                System.GC.Collect();
                System.GC.WaitForPendingFinalizers();
    
                System.Diagnostics.Process.GetCurrentProcess()?.Kill();
            }
    
            protected override void OnStartup(System.Windows.StartupEventArgs e)
            {
                base.OnStartup(e);
    
                this.Activated += app_Activated;
    
                if (this.StartupUri == null)
                {
                    var w = new System.Windows.Window() { Content = "Smart Card Test", SizeToContent = System.Windows.SizeToContent.WidthAndHeight };
                    w.Show();
                }
            }
    
            private async void app_Activated(object sender, System.EventArgs e)
            {
                this.Activated -= app_Activated;
    
                await TestAsync();
    
                System.GC.Collect();
                System.GC.WaitForPendingFinalizers();
    
                await System.Threading.Tasks.Task.Delay(System.TimeSpan.FromSeconds(5));
                App.Current.MainWindow.Close();
            }
    
            public static async System.Threading.Tasks.Task TestAsync()
            {
                //nuget Microsoft.Windows.SDK.Contracts
                var selectorString = global::Windows.Devices.SmartCards.SmartCardReader.GetDeviceSelector();
                var devs = await global::Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(selectorString);
                if (devs.Count == 0)
                {
                    return;
                }
    
                var dev = devs[0];
                var reader = await global::Windows.Devices.SmartCards.SmartCardReader.FromIdAsync(dev.Id);
                System.Diagnostics.Debug.WriteLine(reader.Name);
            }
        }
    }
    

0 件の追加の回答

並べ替え方法: 最も役に立つ