C# USB バーコード スキャナー: IronBarcode の完全統合ガイド
USB バーコード スキャナーはキーボード入力デバイスとして機能し、スキャンしたデータを C# アプリケーションに自動的に送信します。 IronBarcode はこの入力を処理して形式を検証し、構造化データを抽出し、新しいバーコードを生成し、展開の複雑さを最小限に抑えながら在庫管理システム用の完全なスキャン ソリューションを作成します。
小売、倉庫、在庫管理業務は、効率的なバーコードスキャンに依存します。 IronBarcodeとその効果的な検証および生成機能を使用すると、開発者は単純なデータキャプチャを超えた信頼性の高い USB バーコード スキャナー アプリケーションを構築できます。 ライブラリはバーコード データを検証し、構造化された情報を抽出し、新しいバーコードを即座に生成します。
このガイドでは、C# で USB バーコード スキャナーをIronBarcodeと統合する方法を説明します。 その結果、.NET Framework と .NET アプリケーションの両方で動作するリアルタイム スキャン ソリューションが実現し、チームが在庫を管理し、アイテムを効率的に追跡できるようになります。 販売時点管理システムを構築する場合でも、企業の在庫管理ソリューションを構築する場合でも、IronBarcode のクロスプラットフォーム互換性により、アプリケーションはWindows 、 Linux 、またはmacOSでスムーズに実行されます。
USBバーコードスキャナーはIronBarcodeとどのように連携するか?
統合においてキーボード ウェッジ モードが重要なのはなぜですか?
ほとんどの USB バーコード スキャナーは HID キーボード ウェッジ モードで動作し、キーボード入力をエミュレートして簡単にコードをスキャンできます。 バーコードをスキャンする場合、スキャナーはデータを"入力"し、その後に Enter キーを押します。 IronBarcode は、フォーマットを検証し、構造化データを抽出し、スキャンに応じて即座にバーコードを生成できるようにすることで、この生の入力を改善します。
さまざまなスキャナー通信モードを理解することは、エンタープライズ アプリケーションに役立ちます。 プロフェッショナル スキャナーは、キーボード ウェッジ モードを超えてシリアル通信と直接 USB HID モードをサポートします。
// Example: Handling different scanner input modes
public interface IScannerInput
{
event EventHandler<string> BarcodeScanned;
void StartListening();
void StopListening();
}
// Keyboard wedge implementation
public class KeyboardWedgeScanner : IScannerInput
{
public event EventHandler<string> BarcodeScanned;
private readonly TextBox _inputBox;
public KeyboardWedgeScanner(TextBox inputBox)
{
_inputBox = inputBox;
_inputBox.KeyPress += OnKeyPress;
}
private void OnKeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
BarcodeScanned?.Invoke(this, _inputBox.Text);
_inputBox.Clear();
}
}
public void StartListening() => _inputBox.Focus();
public void StopListening() => _inputBox.Enabled = false;
}
// Serial port implementation for professional scanners
public class SerialPortScanner : IScannerInput
{
public event EventHandler<string> BarcodeScanned;
private System.IO.Ports.SerialPort _port;
public SerialPortScanner(string portName, int baudRate = 9600)
{
_port = new System.IO.Ports.SerialPort(portName, baudRate);
_port.DataReceived += OnDataReceived;
}
private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string data = _port.ReadLine().Trim();
BarcodeScanned?.Invoke(this, data);
}
public void StartListening() => _port.Open();
public void StopListening() => _port.Close();
}// Example: Handling different scanner input modes
public interface IScannerInput
{
event EventHandler<string> BarcodeScanned;
void StartListening();
void StopListening();
}
// Keyboard wedge implementation
public class KeyboardWedgeScanner : IScannerInput
{
public event EventHandler<string> BarcodeScanned;
private readonly TextBox _inputBox;
public KeyboardWedgeScanner(TextBox inputBox)
{
_inputBox = inputBox;
_inputBox.KeyPress += OnKeyPress;
}
private void OnKeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
BarcodeScanned?.Invoke(this, _inputBox.Text);
_inputBox.Clear();
}
}
public void StartListening() => _inputBox.Focus();
public void StopListening() => _inputBox.Enabled = false;
}
// Serial port implementation for professional scanners
public class SerialPortScanner : IScannerInput
{
public event EventHandler<string> BarcodeScanned;
private System.IO.Ports.SerialPort _port;
public SerialPortScanner(string portName, int baudRate = 9600)
{
_port = new System.IO.Ports.SerialPort(portName, baudRate);
_port.DataReceived += OnDataReceived;
}
private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string data = _port.ReadLine().Trim();
BarcodeScanned?.Invoke(this, data);
}
public void StartListening() => _port.Open();
public void StopListening() => _port.Close();
}開発者はどのようにしてスキャナーの入力をキャプチャして検証できるのでしょうか?
// Capture scanner input and validate with IronBarcode
private async void ProcessScannerInput(string scannedData)
{
try
{
// Validate the scanned data format
var validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128);
var results = await BarcodeReader.ReadAsync(validationBarcode.ToBitmap());
if (results.Any())
{
var result = results.First();
// Extract metadata for enterprise systems
var scanMetadata = new ScanMetadata
{
BarcodeType = result.BarcodeType,
Value = result.Value,
Confidence = result.Confidence,
ScanTimestamp = DateTime.UtcNow,
ScannerDevice = GetCurrentScannerInfo()
};
await ProcessValidBarcode(scanMetadata);
}
else
{
HandleInvalidScan(scannedData);
}
}
catch (Exception ex)
{
LogScanError(ex, scannedData);
}
}// Capture scanner input and validate with IronBarcode
private async void ProcessScannerInput(string scannedData)
{
try
{
// Validate the scanned data format
var validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128);
var results = await BarcodeReader.ReadAsync(validationBarcode.ToBitmap());
if (results.Any())
{
var result = results.First();
// Extract metadata for enterprise systems
var scanMetadata = new ScanMetadata
{
BarcodeType = result.BarcodeType,
Value = result.Value,
Confidence = result.Confidence,
ScanTimestamp = DateTime.UtcNow,
ScannerDevice = GetCurrentScannerInfo()
};
await ProcessValidBarcode(scanMetadata);
}
else
{
HandleInvalidScan(scannedData);
}
}
catch (Exception ex)
{
LogScanError(ex, scannedData);
}
}このコードは、さまざまな方法でスキャナーの入力をキャプチャし、 IronBarcode の非同期読み取り機能を使用して、UI スレッドをブロックせずにスキャンされたデータを検証します。 信頼しきい値機能により、実稼働環境では高品質のスキャンのみが処理されるようになります。
バーコードスキャナープロジェクトをどのように設定するか?
必須の依存関係と構成は何ですか?
まず、デスクトップ シナリオ用に Visual Studio で Windows フォーム アプリケーションを作成するか、Web ベースのスキャン アプリケーションの場合はBlazor を検討してください。 モバイル在庫ソリューションの場合、 .NET MAUI はAndroidおよびiOS 機能による優れたクロスプラットフォーム サポートを提供します。 次に、NuGet パッケージ マネージャー コンソールからIronBarcode をインストールします。
Install-Package BarCode
コンテナ化されたデプロイメントの場合、 IronBarcode は Docker とシームレスに連携し、エンタープライズ環境向けのデプロイメント マニフェストを提供します。
クイックスタート: C# で QR コード画像を作成する
QR コードを作成すると、スキャン可能な四角形にデータをエンコードした視覚的な表現が生成されます。
今すぐ NuGet で PDF を作成してみましょう:
NuGet パッケージ マネージャーを使用して IronBarcode をインストールします
このコード スニペットをコピーして実行します。
using IronBarCode; // Generate QR code from scanned inventory data string inventoryCode = "INV-2025-001"; var qrCode = BarcodeWriter.CreateQrCode(inventoryCode); // Apply styling for professional labels qrCode.ResizeTo(300, 300); qrCode.SetMargins(10); qrCode.ChangeQrCodeColor(IronSoftware.Drawing.Color.DarkBlue); // Add logo for branding qrCode.AddLogoToQrCode("company_logo.png", 60, 60); // Save as high-quality image qrCode.SaveAsPng("inventory_qr.png"); // Alternative: Save as PDF for printing qrCode.SaveAsPdf("inventory_qr.pdf");実際の環境でテストするためにデプロイする
アプリケーションにはどの名前空間を含める必要がありますか?
ドキュメントの例とともに、次の重要な名前空間をフォームに追加します。
using IronBarCode;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.IO.Ports; // For serial scanners
using System.Diagnostics; // For performance monitoringusing IronBarCode;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.IO.Ports; // For serial scanners
using System.Diagnostics; // For performance monitoring開発者はスキャナー入力フォームをどのように構成すればよいでしょうか?
エンタープライズ アプリケーションは、複数のスキャナー ブランドをサポートする柔軟なスキャナー構成システムの恩恵を受けます。
public class ScannerConfiguration
{
public string ScannerType { get; set; } // "KeyboardWedge", "Serial", "USB-HID"
public string PortName { get; set; } // For serial scanners
public int BaudRate { get; set; } = 9600;
public string Terminator { get; set; } = "\r\n";
public bool EnableBeep { get; set; } = true;
// Brand-specific settings
public Dictionary<string, string> BrandSettings { get; set; } = new();
// Common scanner brand configurations
public static ScannerConfiguration GetHoneywellConfig()
{
return new ScannerConfiguration
{
ScannerType = "Serial",
BaudRate = 115200,
BrandSettings = new Dictionary<string, string>
{
{"Prefix", "STX"},
{"Suffix", "ETX"},
{"TriggerMode", "Manual"}
}
};
}
public static ScannerConfiguration GetSymbolConfig()
{
return new ScannerConfiguration
{
ScannerType = "KeyboardWedge",
BrandSettings = new Dictionary<string, string>
{
{"ScanMode", "Continuous"},
{"BeepVolume", "High"}
}
};
}
}public class ScannerConfiguration
{
public string ScannerType { get; set; } // "KeyboardWedge", "Serial", "USB-HID"
public string PortName { get; set; } // For serial scanners
public int BaudRate { get; set; } = 9600;
public string Terminator { get; set; } = "\r\n";
public bool EnableBeep { get; set; } = true;
// Brand-specific settings
public Dictionary<string, string> BrandSettings { get; set; } = new();
// Common scanner brand configurations
public static ScannerConfiguration GetHoneywellConfig()
{
return new ScannerConfiguration
{
ScannerType = "Serial",
BaudRate = 115200,
BrandSettings = new Dictionary<string, string>
{
{"Prefix", "STX"},
{"Suffix", "ETX"},
{"TriggerMode", "Manual"}
}
};
}
public static ScannerConfiguration GetSymbolConfig()
{
return new ScannerConfiguration
{
ScannerType = "KeyboardWedge",
BrandSettings = new Dictionary<string, string>
{
{"ScanMode", "Continuous"},
{"BeepVolume", "High"}
}
};
}
}IronBarcodeを使用してスキャンバーコードをどのように検証するか?
バーコード検証に最適なアプローチは何ですか?
IronBarcode は、さまざまな形式のバーコード データの検証と解析に優れています。 ライブラリは、Code 128 、 EAN-13 、 Code 39などの1D バーコードに加えて、 QR コードやData Matrixなどの2D 形式もサポートしています。 検証の改善アプローチは次のとおりです。
public class BarcodeValidator
{
private readonly Dictionary<BarcodeType, Func<string, bool>> _validators;
public BarcodeValidator()
{
_validators = new Dictionary<BarcodeType, Func<string, bool>>
{
{ BarcodeType.Code128, ValidateCode128 },
{ BarcodeType.EAN13, ValidateEAN13 },
{ BarcodeType.UPCA, ValidateUPCA },
{ BarcodeType.QRCode, ValidateQRCode }
};
}
public async Task<ValidationResult> ValidateScannedBarcodeAsync(string scannedText)
{
var result = new ValidationResult();
try
{
// Attempt multiple barcode formats for flexibility
var encodings = new[] {
BarcodeEncoding.Code128,
BarcodeEncoding.EAN13,
BarcodeEncoding.UPCA,
BarcodeEncoding.QRCode
};
foreach (var encoding in encodings)
{
try
{
var barcode = BarcodeWriter.CreateBarcode(scannedText, encoding);
var validationResults = await BarcodeReader.ReadAsync(barcode.ToBitmap());
if (validationResults.Any())
{
var validated = validationResults.First();
result.IsValid = true;
result.Format = validated.BarcodeType;
result.Value = validated.Value;
result.Confidence = validated.Confidence;
// Apply format-specific validation
if (_validators.ContainsKey(validated.BarcodeType))
{
result.PassesBusinessRules = _validators___PROTECTED_LINK_35___;
}
break;
}
}
catch { /* Try next format */ }
}
// Handle GS1-128 for supply chain applications
if (!result.IsValid && IsGS1Format(scannedText))
{
result = await ValidateGS1BarcodeAsync(scannedText);
}
}
catch (Exception ex)
{
result.Error = ex.Message;
}
return result;
}
private bool ValidateEAN13(string value)
{
// EAN-13 checksum validation
if (value.Length != 13) return false;
int sum = 0;
for (int i = 0; i < 12; i++)
{
int digit = int.Parse(value[i].ToString());
sum += (i % 2 == 0) ? digit : digit * 3;
}
int checkDigit = (10 - (sum % 10)) % 10;
return checkDigit == int.Parse(value[12].ToString());
}
}public class BarcodeValidator
{
private readonly Dictionary<BarcodeType, Func<string, bool>> _validators;
public BarcodeValidator()
{
_validators = new Dictionary<BarcodeType, Func<string, bool>>
{
{ BarcodeType.Code128, ValidateCode128 },
{ BarcodeType.EAN13, ValidateEAN13 },
{ BarcodeType.UPCA, ValidateUPCA },
{ BarcodeType.QRCode, ValidateQRCode }
};
}
public async Task<ValidationResult> ValidateScannedBarcodeAsync(string scannedText)
{
var result = new ValidationResult();
try
{
// Attempt multiple barcode formats for flexibility
var encodings = new[] {
BarcodeEncoding.Code128,
BarcodeEncoding.EAN13,
BarcodeEncoding.UPCA,
BarcodeEncoding.QRCode
};
foreach (var encoding in encodings)
{
try
{
var barcode = BarcodeWriter.CreateBarcode(scannedText, encoding);
var validationResults = await BarcodeReader.ReadAsync(barcode.ToBitmap());
if (validationResults.Any())
{
var validated = validationResults.First();
result.IsValid = true;
result.Format = validated.BarcodeType;
result.Value = validated.Value;
result.Confidence = validated.Confidence;
// Apply format-specific validation
if (_validators.ContainsKey(validated.BarcodeType))
{
result.PassesBusinessRules = _validators___PROTECTED_LINK_35___;
}
break;
}
}
catch { /* Try next format */ }
}
// Handle GS1-128 for supply chain applications
if (!result.IsValid && IsGS1Format(scannedText))
{
result = await ValidateGS1BarcodeAsync(scannedText);
}
}
catch (Exception ex)
{
result.Error = ex.Message;
}
return result;
}
private bool ValidateEAN13(string value)
{
// EAN-13 checksum validation
if (value.Length != 13) return false;
int sum = 0;
for (int i = 0; i < 12; i++)
{
int digit = int.Parse(value[i].ToString());
sum += (i % 2 == 0) ? digit : digit * 3;
}
int checkDigit = (10 - (sum % 10)) % 10;
return checkDigit == int.Parse(value[12].ToString());
}
}複数ページのドキュメントの場合、IronBarcode はPDFおよび複数ページの TIFF ファイルからバーコードを読み取ることができます。
アプリケーションはどのバーコード形式を検証できますか?
この検証方法は、すべての主要な1D バーコード形式と2D バーコード形式をサポートしています。 特殊なアプリケーション向けに、IronBarcode は、サプライ チェーン管理で一般的に使用されるMSI バーコードとGS1-128形式もサポートしています。
スキャンされた入力からレスポンスバーコードを生成する方法は?
アプリケーションはいつスキャン データから新しいバーコードを作成する必要がありますか?
生産準備が整った機能を使用して、スキャンしたデータをラベル付け、追跡、在庫管理用の新しいバーコードに変換します。 IronBarcode の生成機能は、さまざまなデータ タイプからバーコードを作成することをサポートします。 バーコードを画像、 PDF 、 HTML 、またはストリームとしてエクスポートします。
public class InventoryBarcodeGenerator
{
private readonly string _labelPath = "labels";
public InventoryBarcodeGenerator()
{
// Ensure proper licensing for production use
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
System.IO.Directory.CreateDirectory(_labelPath);
}
public async Task<GeneratedBarcode> GenerateInventoryLabelAsync(string productCode, InventoryAction action)
{
try
{
// Generate structured inventory code
var inventoryCode = GenerateStructuredCode(productCode, action);
// Create high-quality barcode with production settings
var barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128);
// Apply enterprise styling
barcode.ResizeTo(400, 120);
barcode.SetMargins(10);
barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12);
barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black);
// Add data matrix for redundancy in warehouse environments
var dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix);
dataMatrix.ResizeTo(100, 100);
// Save with error handling
var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
var fileName = $"{inventoryCode}_{timestamp}";
// Save as multiple formats for flexibility
await Task.Run(() =>
{
barcode.SaveAsPng($"{_labelPath}\\{fileName}.png");
barcode.SaveAsPdf($"{_labelPath}\\{fileName}.pdf");
barcode.SaveAsSvg($"{_labelPath}\\{fileName}.svg");
});
return new GeneratedBarcode
{
Code = inventoryCode,
LinearBarcodePath = $"{_labelPath}\\{fileName}.png",
DataMatrixPath = $"{_labelPath}\\{fileName}_dm.png",
Timestamp = DateTime.UtcNow
};
}
catch (Exception ex)
{
throw new BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex);
}
}
private string GenerateStructuredCode(string productCode, InventoryAction action)
{
// Implement GS1 Application Identifiers for enterprise compatibility
var ai = action switch
{
InventoryAction.Receive => "10", // Batch/Lot number
InventoryAction.Ship => "400", // Customer purchase order
InventoryAction.Count => "37", // Quantity
_ => "91" // Internal use
};
return $"({ai}){DateTime.Now:yyMMdd}{productCode}";
}
}public class InventoryBarcodeGenerator
{
private readonly string _labelPath = "labels";
public InventoryBarcodeGenerator()
{
// Ensure proper licensing for production use
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
System.IO.Directory.CreateDirectory(_labelPath);
}
public async Task<GeneratedBarcode> GenerateInventoryLabelAsync(string productCode, InventoryAction action)
{
try
{
// Generate structured inventory code
var inventoryCode = GenerateStructuredCode(productCode, action);
// Create high-quality barcode with production settings
var barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128);
// Apply enterprise styling
barcode.ResizeTo(400, 120);
barcode.SetMargins(10);
barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12);
barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black);
// Add data matrix for redundancy in warehouse environments
var dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix);
dataMatrix.ResizeTo(100, 100);
// Save with error handling
var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
var fileName = $"{inventoryCode}_{timestamp}";
// Save as multiple formats for flexibility
await Task.Run(() =>
{
barcode.SaveAsPng($"{_labelPath}\\{fileName}.png");
barcode.SaveAsPdf($"{_labelPath}\\{fileName}.pdf");
barcode.SaveAsSvg($"{_labelPath}\\{fileName}.svg");
});
return new GeneratedBarcode
{
Code = inventoryCode,
LinearBarcodePath = $"{_labelPath}\\{fileName}.png",
DataMatrixPath = $"{_labelPath}\\{fileName}_dm.png",
Timestamp = DateTime.UtcNow
};
}
catch (Exception ex)
{
throw new BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex);
}
}
private string GenerateStructuredCode(string productCode, InventoryAction action)
{
// Implement GS1 Application Identifiers for enterprise compatibility
var ai = action switch
{
InventoryAction.Receive => "10", // Batch/Lot number
InventoryAction.Ship => "400", // Customer purchase order
InventoryAction.Count => "37", // Quantity
_ => "91" // Internal use
};
return $"({ai}){DateTime.Now:yyMMdd}{productCode}";
}
}特殊な要件の場合、開発者は高コントラスト印刷用の1 BPP バーコード イメージを作成したり、既存の PDF にバーコードをスタンプしたりできます。
生成されたバーコードにはどのようなカスタマイズ オプションがありますか?
IronBarcode は、色の変更、余白の設定、ロゴを埋め込んだQR コードのスタイル設定など、幅広いカスタマイズ オプションを提供します。

完全なバーコードスキャンアプリケーションをどのように構築するか?
実稼働対応のスキャナー実装とはどのようなものですか?
完全なエラー処理とパフォーマンスの最適化を備えたエンタープライズ グレードの実装をご紹介します。 このアプローチでは、IronBarcode のパフォーマンス機能と非同期機能を使用してスループットを向上させます。
using IronBarCode;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace EnterpriseBarcodeScanner
{
public partial class HighVolumeScanner : Form
{
private readonly ConcurrentQueue<ScanData> _scanQueue = new();
private readonly SemaphoreSlim _processingSemaphore;
private readonly CancellationTokenSource _cancellationTokenSource = new();
private IScannerInput _activeScanner;
private int _maxConcurrentProcessing = Environment.ProcessorCount;
public HighVolumeScanner()
{
InitializeComponent();
_processingSemaphore = new SemaphoreSlim(_maxConcurrentProcessing);
InitializeScanner();
StartProcessingQueue();
}
private void InitializeScanner()
{
// Auto-detect scanner type
if (SerialPort.GetPortNames().Any(p => p.Contains("COM")))
{
_activeScanner = new SerialPortScanner("COM3", 115200);
}
else
{
_activeScanner = new KeyboardWedgeScanner(txtScanner);
}
_activeScanner.BarcodeScanned += OnBarcodeScanned;
_activeScanner.StartListening();
}
private void OnBarcodeScanned(object sender, string barcode)
{
// Queue for async processing to maintain scanner responsiveness
_scanQueue.Enqueue(new ScanData
{
RawData = barcode,
ScanTime = DateTime.UtcNow
});
}
private async void StartProcessingQueue()
{
while (!_cancellationTokenSource.Token.IsCancellationRequested)
{
if (_scanQueue.TryDequeue(out var scanData))
{
await _processingSemaphore.WaitAsync();
_ = Task.Run(async () =>
{
try
{
await ProcessScanAsync(scanData);
}
finally
{
_processingSemaphore.Release();
}
}, _cancellationTokenSource.Token);
}
else
{
await Task.Delay(10); // Prevent CPU spinning
}
}
}
private async Task ProcessScanAsync(ScanData scanData)
{
try
{
// Validate with timeout for performance
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));
var validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData);
var completedTask = await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token));
if (completedTask == validationTask)
{
var result = await validationTask;
if (result.Success)
{
// Update UI thread-safe
BeginInvoke(new Action(() =>
{
AddToInventory(result);
GenerateLabelsIfNeeded(result);
}));
}
else
{
LogScanError(scanData, result.Error);
}
}
else
{
LogScanTimeout(scanData);
}
}
catch (Exception ex)
{
LogCriticalError(ex, scanData);
}
}
private async Task<ProcessingResult> ValidateAndProcessBarcodeAsync(string rawData)
{
// Implement smart caching for repeated scans
if (BarcodeCache.TryGetCached(rawData, out var cachedResult))
{
return cachedResult;
}
// Use IronBarcode with optimized settings
var barcodeOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false,
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode,
MaxParallelThreads = 1 // Single barcode, no need for parallel
};
// Generate and validate
var testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128);
var results = await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions);
var result = new ProcessingResult
{
Success = results.Any(),
BarcodeData = results.FirstOrDefault(),
ProcessingTime = DateTime.UtcNow
};
BarcodeCache.Add(rawData, result);
return result;
}
}
}using IronBarCode;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace EnterpriseBarcodeScanner
{
public partial class HighVolumeScanner : Form
{
private readonly ConcurrentQueue<ScanData> _scanQueue = new();
private readonly SemaphoreSlim _processingSemaphore;
private readonly CancellationTokenSource _cancellationTokenSource = new();
private IScannerInput _activeScanner;
private int _maxConcurrentProcessing = Environment.ProcessorCount;
public HighVolumeScanner()
{
InitializeComponent();
_processingSemaphore = new SemaphoreSlim(_maxConcurrentProcessing);
InitializeScanner();
StartProcessingQueue();
}
private void InitializeScanner()
{
// Auto-detect scanner type
if (SerialPort.GetPortNames().Any(p => p.Contains("COM")))
{
_activeScanner = new SerialPortScanner("COM3", 115200);
}
else
{
_activeScanner = new KeyboardWedgeScanner(txtScanner);
}
_activeScanner.BarcodeScanned += OnBarcodeScanned;
_activeScanner.StartListening();
}
private void OnBarcodeScanned(object sender, string barcode)
{
// Queue for async processing to maintain scanner responsiveness
_scanQueue.Enqueue(new ScanData
{
RawData = barcode,
ScanTime = DateTime.UtcNow
});
}
private async void StartProcessingQueue()
{
while (!_cancellationTokenSource.Token.IsCancellationRequested)
{
if (_scanQueue.TryDequeue(out var scanData))
{
await _processingSemaphore.WaitAsync();
_ = Task.Run(async () =>
{
try
{
await ProcessScanAsync(scanData);
}
finally
{
_processingSemaphore.Release();
}
}, _cancellationTokenSource.Token);
}
else
{
await Task.Delay(10); // Prevent CPU spinning
}
}
}
private async Task ProcessScanAsync(ScanData scanData)
{
try
{
// Validate with timeout for performance
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));
var validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData);
var completedTask = await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token));
if (completedTask == validationTask)
{
var result = await validationTask;
if (result.Success)
{
// Update UI thread-safe
BeginInvoke(new Action(() =>
{
AddToInventory(result);
GenerateLabelsIfNeeded(result);
}));
}
else
{
LogScanError(scanData, result.Error);
}
}
else
{
LogScanTimeout(scanData);
}
}
catch (Exception ex)
{
LogCriticalError(ex, scanData);
}
}
private async Task<ProcessingResult> ValidateAndProcessBarcodeAsync(string rawData)
{
// Implement smart caching for repeated scans
if (BarcodeCache.TryGetCached(rawData, out var cachedResult))
{
return cachedResult;
}
// Use IronBarcode with optimized settings
var barcodeOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false,
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode,
MaxParallelThreads = 1 // Single barcode, no need for parallel
};
// Generate and validate
var testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128);
var results = await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions);
var result = new ProcessingResult
{
Success = results.Any(),
BarcodeData = results.FirstOrDefault(),
ProcessingTime = DateTime.UtcNow
};
BarcodeCache.Add(rawData, result);
return result;
}
}
}パフォーマンスを向上させるには、特定の画像領域のスキャンに焦点を合わせるためにトリミング領域を実装します。 バーコード リーダーの設定により、さまざまなドキュメント タイプに合わせて微調整できます。
チームはどのようにフォールバックメカニズムを実装できますか?
このエンタープライズ対応のスキャナー アプリケーションは、いくつかの重要なパターンを実装しています。
1.非同期キュー処理: 非同期操作を使用してUIのブロックを防止します 2.並行処理:複数のスレッドを使用して並列検証を行う 3.スマートキャッシング: 頻繁に使用されるアイテムの冗長処理を削減 4.パフォーマンス監視:読み取り速度オプションを使用してスキャン速度を追跡します 5.柔軟なスキャナサポート: 利用可能なハードウェアを自動検出
*無効なフォーマット:* BarcodeWriter がサポートされていないデータに遭遇したときに例外をキャッチします スキャナの切断:スキャナの取り外しを処理するために TextBox のフォーカス管理を実装します データ検証: IronBarcode のフォーマット固有のエンコードを使用してデータの互換性を確保します 生成の失敗:**バーコード生成をtry-catchブロックで囲む *タイムアウト処理:スキャナとキーボード入力を区別するためにキーストロークのタイミングを実装することを検討してください

バーコード スキャナー プロジェクトの次のステップは何ですか?
IronBarcode は、シンプルな USB バーコード スキャンをインテリジェントなデータ処理アプリケーションに変換します。 ハードウェア スキャナーの入力と IronBarcode の検証、生成、および形式変換機能を組み合わせることで、開発者はあらゆる業界向けの信頼性の高いスキャン ソリューションを構築できます。 ライブラリの非同期操作とマルチスレッドのサポートにより、拡大するビジネス ニーズに合わせてアプリケーションを拡張できます。
クラウド展開の場合、IronBarcode はAWS LambdaとAzure Functionsの優れたサポートを提供し、大規模なサーバーレスバーコード処理を可能にします。 このライブラリは、マイクロサービス アーキテクチャ用のDocker コンテナーとシームレスに統合されます。
エンタープライズ在庫システムを実装する場合は、次のアーキテクチャ パターンを考慮してください。
1.マイクロサービス: Docker 上の IronBarcodeを使用してスキャンを別のサービスとしてデプロイする 2.モバイル統合: AndroidおよびiOSをサポートするデバイスに拡張
- Webアプリケーション: Blazor統合によるブラウザベースのスキャンの構築 4.高可用性:複数の読み取りオプションで冗長性を実装する
今すぐ無料トライアルを開始して、C# アプリケーションにプロフェッショナルなバーコード スキャンを実装してください。 関連機能については、バーコード スキャン ワークフローを補完するテキスト認識機能を備えたIronOCR をご覧ください。
よくある質問
IronBarcodeとは何であり、それはUSBバーコードスキャナーとどのように関連していますか?
IronBarcodeは、USBバーコードスキャニングのための堅牢なC#アプリケーションを開発者が構築できるライブラリです。バーコード検証、データ抽出、およびバーコード生成などの機能を提供します。
IronBarcodeはUSBスキャナーからのバーコードデータを検証できますか?
はい、IronBarcodeは、USBスキャナーからキャプチャしたバーコードデータを検証し、C#アプリケーションのデータ整合性と精度を確保します。
IronBarcodeはバーコード生成をどのように扱っていますか?
IronBarcodeは、新しいバーコードをオンザフライで生成し、C#アプリケーション内で簡単にバーコードを作成し印刷できるようにします。
IronBarcodeにはUSBバーコードスキャニング用のエラーハンドリングサポートがありますか?
はい、IronBarcodeには、USBバーコードスキャニングと処理中に発生する一般的な問題を管理するための包括的なエラーハンドリングが含まれています。
IronBarcodeを使用してスキャンできるバーコードの種類は何ですか?
IronBarcodeはQRコード、UPC、Code 39など、多くのバーコードシンボロジーのスキャニングをサポートしており、さまざまなアプリケーションにおいて多用途です。
IronBarcodeはスキャンされたバーコードから構造化情報を抽出できますか?
はい、IronBarcodeはスキャンされたバーコードから構造化情報を抽出し、効率的なデータ処理と管理を支援します。
C#でUSBバーコードスキャナーアプリケーションの構築を始めるにはどうすればいいですか?
C#でUSBバーコードスキャナーアプリケーションの構築を始めるには、IronBarcodeと提供されたコード例とドキュメントを利用し、開発プロセスをガイドにします。







