Skip to content

Instantly share code, notes, and snippets.

Avatar
📡
I'm looking for a job

Kouji Matsui kekyo

📡
I'm looking for a job
View GitHub Profile
@kekyo
kekyo / ValueTypeHashCodeTest.cs
Created Oct 16, 2020
ValueTypeHashCodeTest.cs
View ValueTypeHashCodeTest.cs
using System;
namespace ConsoleApp1
{
//.class private sealed sequential ansi beforefieldinit
//ConsoleApp1.Test
//extends [System.Runtime]System.ValueType
//{
// .field public int32 IntValue
// .field public string StringValue
View UnificationPolarity.cs
using System;
namespace UnificationPolarity
{
public static class Class1
{
public static IConvertible foo(IConvertible arg) =>
arg;
public static Func<IConvertible, IConvertible> bar(Func<IConvertible, IConvertible> arg) =>
@kekyo
kekyo / Program.cs
Created Oct 1, 2019
Generic covariance in C#
View Program.cs
using System;
using System.Collections.Generic;
namespace ConsoleApp6
{
class Program
{
public interface IBar
{
// ....
@kekyo
kekyo / MainWindow.xaml
Created Aug 25, 2019
Causes reentrant by invalid monitor lock usage with async/await method.
View MainWindow.xaml
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<DockPanel>
<Button DockPanel.Dock="Bottom" Click="Button_Click" Content="Append" />
<TextBlock x:Name="input" />
@kekyo
kekyo / MainWindow.xaml
Last active Aug 25, 2019
Async operation in WPF
View MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<DockPanel>
<Button DockPanel.Dock="Bottom" Click="Button_Click" Content="Append" />
<TextBlock x:Name="input" />
@kekyo
kekyo / Program.cs
Created Aug 24, 2019
Continuation vs Awaiting.
View Program.cs
using System;
using System.Threading.Tasks;
namespace ConsoleApp5
{
public static class Program
{
private static async Task ContinuationWithAwaitingSimple()
{
Console.WriteLine("Before");
@kekyo
kekyo / Program.cs
Last active Aug 24, 2019
Awaiting on Monitor lock vs. AsyncEx
View Program.cs
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Nito.AsyncEx;
namespace ConsoleApp4
{
public static class Program
@kekyo
kekyo / task.md
Last active Jul 8, 2019
Task.Runで非同期APIをシミュレートすべきかどうかの判断
View task.md

朝バタバタしてクリアじゃなかった... ちょっと間違ってましたこういうことです:

  • 多数同時並行するタスクがある場合
    • Windowsの場合はI/O完了ポートの「ブロックされたスレッドを検出するとワーカースレッドを世に放つ」機能があるので、同期APIがブロックしても、ワーカースレッド上限まではOK(ThreadPool.SetMaxThreadsの第二引数completionPortThreads)。
    • Windowsではない環境では必ず上記機能が使えるとは言えない(多分単純スレッドプール)ので、同期APIによるスレッドブロックが発生すると、同時並行動作数はそれ以上伸びない。これを避けたい場合、Task.Run を使わざるを得ない。
  • 多数同時並行したいタスクがない、GUIの場合
    • 同期APIでブロックすると、それがUIスレッドの場合はUIが固まってしまうので、それを避けたいなら Task.Run を使わざるを得ない。但し、継続処理がUIを操作する場合はUIスレッドにマーシャリングすることになり、そのコストはかなり高いことに注意(≒await後の処理でUI部品を操作する場合など)。
  • 多数同時並行したいタスクがない場合
    • 同期APIと非同期APIを比較すると、非同期APIのほうが余分なハンドリングを必要とするコストがあるので、この場合は同期APIをそのまま使うのがいい。

Taskを使うかValueTaskを使うかによる差については、本来はすべてをTaskを返す非同期APIとして定義したいが、ほとんどの場合同期的に完了してしまう(つまり一瞬で操作が完了する、待機する可能性が0ではないが殆ど待機しないというような)処理を、いつもTaskで管理するのはコストが高いので、代わりにValueTaskを使って初めから完了しているものはコストをほとんど0とするようにするという話です。

@kekyo
kekyo / Program.cs
Created May 20, 2019
Extract member symbol names, include kanji dot notation.
View Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace ExtractSymbols
{
class Program
{
@kekyo
kekyo / make.bat
Created Apr 8, 2019
Embedding subtitles into mp4 container using ffmpeg
View make.bat
setlocal EnableDelayedExpansion
for %%p in (original\*.mp4) do (
rem echo "%%p" "%%~dp%%~pp%%~np.srt"
..\..\ffmpeg\bin\ffmpeg.exe -i "%%p" -i "%%~dp%%~pp%%~np.en.srt" -map 0:v -map 0:a -map 1:s -metadata:s:s:0 language=eng -c:v copy -c:a copy -c:s mov_text "%%~np.mp4"
)
You can’t perform that action at this time.