�A�ځFReactive Extensions�iRx�j����

��2�� �C�x���g�E�v���O���~���O��Rx

�͍� �X��
2012/01/06
Page1 Page2 Page3

�@�{�A�ڂ���1���ł́AReactive Extensions�i�ȍ~�ARx�j�̊T�v�ƃC���X�g�[�����@����������B���񂩂�͋�̓I�Ȏg���������Ă������B

�@�܂���Rx�𗘗p����ۂ̊�{�I�ȗ�������Ă����B���ɁARx�̎��‘�\�I��2�‚̐����ł���C�x���g�Ɣ񓯊��̂����A�C�x���g�𒆐S�I�Ɏ��グ��B

����{�I�ȋL�q���@

�@�ŏ��ɁA�V���v����Rx�iObservable�I�u�W�F�N�g�j�̃R�[�h�ƁAforeach���iEnumerable�I�u�W�F�N�g�j�̃R�[�h�̑Δ�����Ă݂悤�B

using System.Linq;
using System.Reactive.Linq;

// Observable�I�u�W�F�N�g�iRx�̃R�[�h�j
Observable.Range(1, 5)
  .Subscribe(x => Console.WriteLine(x));

// Enumerable�I�u�W�F�N�g
foreach (var x in Enumerable.Range(1, 5))
  Console.WriteLine(x);
Imports System.Reactive.Linq

' Observable�I�u�W�F�N�g�iRx�̃R�[�h�j
Observable.Range(1, 5).
  Subscribe(Sub(x) Console.WriteLine(x))

' Enumerable�I�u�W�F�N�g
For Each x In Enumerable.Range(1, 5)
  Console.WriteLine(x)
Next
�������s���ʂ�Rx��foreach���̃R�[�h�i��FC#�A���FVB�j
��System.Reactive�A�Z���u�����Q�Ƃ���K�v������B

�@���s���ʂ͂Ƃ��Ɂu1�v����u5�v���o�͂����BEnumerable�I�u�W�F�N�g�i�ȍ~�A�uEnumerable�v�Ɨ����j��Pull�^�̃V�[�P���X�i����A�̏����̗���j�AObservable�I�u�W�F�N�g�i�ȍ~�A�uObservable�v�Ɨ����j��Push�^�̃V�[�P���X��\��*1���A�ǂ���������悤�ɋL�q�ł���BEnumerable�ł̓V�[�P���X�iRange�j������A������������́iforeach�j������BRx�ɂ����Ă�����͕ς�炸�A�V�[�P���X������Aforeach���Ɠ��l�̊��o�A�����ʒu��Subscribe���\�b�h��p����Ƃ����̂���{�I�ȗ���ɂȂ�B

*1�@Enumerable�̓f�U�C���E�p�^�[���ł����Ƃ����Iterator�p�^�[���AObservable��Observer�p�^�[����\���Ă���B

�@����ł́A�ڍׂ�m�邽�߂ɃC���^�[�t�F�C�X�����Ă݂悤�BRx�ł̎�v�ȃC���^�[�t�F�C�X��2�AIObservable<T>��IObserver<T>���B���̃R�[�h�͂��̃R�[�h���e�ł���iC#�̏ꍇ�j�B

public interface IObservable<out T>
{
  IDisposable Subscribe(IObserver<T> observer);
}

public interface IObserver<in T>
{
  void OnCompleted();
  void OnError(Exception error);
  void OnNext(T value);
}
IObservable<T>�C���^�[�t�F�C�X��IObserver<T>�C���^�[�t�F�C�X�iC#�̏ꍇ�j

�@�ŏ��ɋ������V���v���ȗ�̒��ł��A����2�‚̃C���^�[�t�F�C�X�����p����Ă���BIObservable<T>�I�u�W�F�N�g���V�[�P���X��\���AIObserver<T>�I�u�W�F�N�g���������̂�\���Ă���B�‚܂�A�uObservable.Range�v�Ƃ����R�[�h���瓾����I�u�W�F�N�g��IObservable<int>�^���B�������AIObserver<T>�I�u�W�F�N�g�͌�������Ȃ��B����IObserver<T>�I�u�W�F�N�g�́ASubscribe���\�b�h�ɓn���Ă��郉���_���̒��Ŏ����I�ɍ���Ă���B���̏ڍׂ𖾂����ƁA���ł͈ȉ��̂悤�ɂȂ��Ă���B

var observer = Observer.Create<int>(
  x => Console.WriteLine(x), // onNext�p�����[�^�i�f���Q�[�g�j
  ex => { throw ex; }, // onError�p�����[�^�i�f���Q�[�g�j
  () => { });  // onCompleted�p�����[�^�i�f���Q�[�g�j

Observable.Range(1, 5).Subscribe(observer);
Dim observer_ = Observer.Create(Of Integer)(
  Sub(x) Console.WriteLine(x),
  Sub(ex) Throw ex,
  Sub() End)

Observable.Range(1, 5).Subscribe(observer_)
Subscribe���\�b�h�̈����ɋL�q���������_���ɂ�萶�������IObserver<int>�I�u�W�F�N�g�̏ڍׁi��FC#�A���FVB�j

�@Observer.Create���\�b�h�ɂ�3�‚̃f���Q�[�g���󂯎��p�����[�^������A���ɁAIObserver<T>�C���^�[�t�F�C�X��OnNext�^OnError�^OnCompleted���\�b�h�̃V�O�l�`���Ɠ����f���Q�[�g�^�ɂȂ��Ă���B���̂��߁A���̏��IObserver<T>�C���^�[�t�F�C�X�����������C���X�^���X�𐶐��ł���悤�ɂȂ��Ă���B

�@�������A����ł��킴�킴Observer.Create���\�b�h��IObserver<T>�I�u�W�F�N�g���쐬����͎̂�Ԃ��낤�B�����ŁAIObservable<T>�C���^�[�t�F�C�X�ɂ́AIObserver<T>�I�u�W�F�N�g�݂̂��󂯎��Subcribe���\�b�h�����łȂ��A�e��̃f���Q�[�g���󂯎��A�����̃I�[�o�[���[�h��Subcribe���\�b�h���A�g�����\�b�h�ɂ���Ēlj�����Ă���*2�B����ɂ��AEnumerable�ł�foreach���Ɠ������o�ŗ��p���邱�Ƃ��”\�ɂȂ��Ă���̂��B

*2�@ObservableExtensions�N���X�iSystem���O��ԁj�ɁAonNext�^onError�^onCompleted�p�����[�^�̑g�ݍ��킹�p�^�[���ɂ��5�‚̃��\�b�h����`����Ă���B

��IObserver<T>�I�u�W�F�N�g�̏ڍ�

�@�ŏ��́u�������s���ʂ�Rx��foreach���̃R�[�h�v�̗�ł�IObserver<T>�C���^�[�t�F�C�X�̃����o�̂����AOnNext���\�b�h�̃f���Q�[�g�����L�q���Ă��Ȃ������B����OnNext�́A�l���I�u�U�[�o�ɓ͂����тɎ��s����郁�\�b�h�ŁA�ł����p�������̂��낤�B�c���2�‚̂����AOnError�͗�O�������Ɏ��s����郁�\�b�h�AOnCompleted�̓V�[�P���X��������Ɏ��s����郁�\�b�h��\���B�����3�‚̃��\�b�h�̃f���Q�[�g���w�肷��ꍇ�́ASubcribe���\�b�h�̃R�[�h��������B

// ����I������ꍇ
// ���s���ʁF1, 2, 3, 4, 5, Completed
Observable.Range(1, 5)
  .Subscribe(
    x => Console.WriteLine(x),
    ex => Console.WriteLine("Error"),
    () => Console.WriteLine("Completed"));

// �r���ŗ�O����������ꍇ
// ���s���ʁF1, 2, Error
Observable.Range(1, 5)
  .Do(x => { if (x == 3) throw new Exception(); })
  .Subscribe(
    x => Console.WriteLine(x),
    ex => Console.WriteLine("Error"),
    () => Console.WriteLine("Completed"));
' ����I������ꍇ
' ���s���ʁF1, 2, 3, 4, 5, Completed
Observable.Range(1, 5).
  Subscribe(
    Sub(x) Console.WriteLine(x),
    Sub(ex) Console.WriteLine("Error"),
    Sub() Console.WriteLine("Completed"))

' �r���ŗ�O����������ꍇ
' ���s���ʁF1, 2, Error
Observable.Range(1, 5).
  Do(Sub(x)
      If (x = 3) Then
        Throw New Exception()
      End If
    End Sub).
  Subscribe(
    Sub(x) Console.WriteLine(x),
    Sub(ex) Console.WriteLine("Error"),
    Sub() Console.WriteLine("Completed"))
OnError�^OnCompleted���\�b�h�̃f���Q�[�g���܂߂�Subcribe���\�b�h�̃R�[�h�̎��s��i��FC#�A���FVB�j
Do���\�b�h�̓p�C�v���C����ʉ߂���l�ɏ����������āA���̒l�͂��̂܂܌㑱�֓n���B����͒l���u3�v�̂Ƃ��ɗ�O�𔭐�������悤�ɂ����B

�@��L�̃R�[�h�����s�����ꍇ�ARange���\�b�h�ɂ��u1�v�`�u5�v�̒l�̐�������������ƁAOnCompleted���\�b�h���Ă΂��A�������͓r���ŗ�O�����������OnError���\�b�h���Ă΂��̂��m�F�ł��邾�낤�B�Ȃ��AOnError���\�b�h�A��������OnCompleted���\�b�h�́A�ǂ��炩�Е������Ă΂�邱�Ƃ͂Ȃ��B�‚܂�AOnError���\�b�h���Ă΂ꂽ���OnCompleted���\�b�h���Ă΂ꂽ�肷�邱�Ƃ͂Ȃ��B�܂��AOnError���\�b�h�A��������OnCompleted���\�b�h���Ă΂ꂽ���OnNext���\�b�h���Ă΂�邱�Ƃ��Ȃ�*3�B

*3�@���̖@����Rx�ɕW���ŗp�ӂ���Ă��郁�\�b�h�ł͂��ׂĎ���Ă���B�܂��A���\�b�h�����삷��ꍇ�ł�Observable.Create���\�b�h�Ƃ�����Rx�W���ŗp�ӂ���Ă��鐶�����\�b�h��p����Ύ����B�����Subscirbe���\�b�h�̌Ăяo�����ɂ�Rx�ŗp�ӂ���Ă���Observer�i�O�q��System.ObservableExtensions�N���X�ɂ��g�����\�b�h�A��������Observer.Create���\�b�h�j���g���Ύ����I�Ɏ����悤�ɂȂ��Ă���B���̂悤�ɁA��d�ɂ��n���Ė@�������炳���悤�ɂȂ��Ă��邽�߁A�ق�100�����̖@�����j���邱�Ƃ͂Ȃ����AIObservable<T>�^IObserver<T>�I�u�W�F�N�g�����ׂĈꂩ�玩�O�Ŏ�������ꍇ�́A���̖@���ɔ����鋓��������”\��������B�������A���̂悤�Ȏ����͂��ׂ��ł͂Ȃ��B���S�̂��߂ɂ��AIObservable<T>�C���^�[�t�F�C�X��IObserver<T>�C���^�[�t�F�C�X����������ۂ́A�ɗ́ARx�ɗp�ӂ���Ă���Observable.Create�^Observer.Create���\�b�h�𗘗p���Ď������ׂ����낤�B�ǂ����Ă�����炪���p�ł��Ȃ��ꍇ�́A�@�������悤�ɒ��Ӑ[����������K�v������B

�@�Ȃ����̂悤�ȋ����ɂȂ��Ă���̂��A�����łȂ���΂Ȃ�Ȃ��̂��Ƃ����ƁAforeach���ōl���Ă݂�ƕ�����₷���B

foreach�����OnNext�^OnError�^OnCompleted���\�b�h�𓖂Ă͂߂��C���[�W

�@foreach���ł̗񋓂����ׂĊ����i�����[�v�𔲂���j������A�ēx�Aforeach���̃��[�v�ɓ��邱�Ƃ͂Ȃ��B�܂��A�񋓂̍Œ��ɗ�O������������A�ēx�Aforeach���̃��[�v�ɓ��邱�Ƃ��Ȃ����A�񋓊����Ƃ͈Ⴄ���[�v�̔����������邽�߁A�񋓊����̕����ɓ��邱�Ƃ��Ȃ��B

�@���̂悤�Ȍ������”\�Ȃ̂́A�A�ڂ̑�1���ŁuIObservable<T>�^IObserver<T>�C���^�[�t�F�C�X�̐��藧�����̂��AIEnumerable<T>�^IEnumerator<T>�C���^�[�t�F�C�X�𔽓]�����č��ꂽ�v�Ɛ��������悤�ɁAIObservable<T>�I�u�W�F�N�g��Enumerable<T>�I�u�W�F�N�g�̐��������ׂĎ��悤�ɂł��Ă��邵�A�܂��A�����łȂ���΂Ȃ�Ȃ�����ł���B

���gDispose�h�̕K�v��

�@Subscribe���\�b�h�̖߂�l��IDisposable�I�u�W�F�N�g�ł��邪�A��L�̗�ł͕ϐ��Ɏ󂯂邱�Ƃ��Ȃ��������Ă���B����́ARx�ɂ�����IDisposable�I�u�W�F�N�g�̈Ӗ����A�]���g���Ă���u�������K�v�����郊�\�[�X������Ă���”\��������v�Ƃ͈قȂ邩�炾�B

�@Rx�ł͌��\�[�X���C�x���g�̏ꍇ�̓C�x���g�́u�f�^�b�`�v�A�^�C�}�[�̏ꍇ�́u���~�v�A�񓯊��̏ꍇ�́u�L�����Z���v�̈Ӗ��Ŏg����B������ɂ���u�I���v�̖������ʂ����i���������̏ꍇ�AOnCompleted���\�b�h�͎��s����Ȃ��j���A�����͑S�āA�K�������Ăяo���Ȃ���΂Ȃ�Ȃ����̂ł͂Ȃ��B�ނ���A�Ăяo���Ȃ��P�[�X�̕���������������Ȃ��B����āASubscribe���\�b�h�̖߂�l�͕K�v���Ȃ���Ζ������Ă����Ȃ��̂ł���B

��Observable�I�u�W�F�N�g�̐����q

�@Enumerable�ɂ����āA�V�[�P���X�A�‚܂�IEnumerable�C���^�[�t�F�C�X������������̂́A�z���List�ADictionary�ȂǁA���鏊�ɑ��݂���B�Ђ�ARx�ɂ�����V�[�P���X�AIObservable<T>�C���^�[�t�F�C�X�������������̂́A�ʏ�ł͂ǂ��ɂ����݂��Ȃ��B�����ŁA�������邽�߂̃��\�b�h����ʂɗp�ӂ���Ă���B

�@�ȉ���Observable�̐����q���܂Ƃ߂�B�Ȃ��A���̕\��Rx��Stable�i����j�łɗp�ӂ���Ă��鐶���q�݂̂ŁAExperimental�i�����j�ł�Rx�ɂ́A����ɒlj�����Ă���B

���\�b�h�� �@�\
Create �C�ӂ�Observable���쐬
Defer Subscribe�����܂ŁA���̃t�@�N�g���E���\�b�h���s��x��
Empty OnCompleted���\�b�h�݂̂����s
FromAsyncPattern Begin-End�p�^�[������쐬
FromEvent *4 Action�f���Q�[�g�̃C�x���g����쐬
FromEventPattern EventHandler�f���Q�[�g�̃C�x���g����쐬
Generate for����͂����l�̔��s
Interval ��莞�Ԃ��Ƃɒl�𔭍s
Never �������s���Ȃ�
Range �w��͈͂̐����𔭍s
Repeat �w��񐔁A����̒l�𔭍s
Return 1�‚݂̂̒l�𔭍s
Start �w��X�P�W���[��*5��ő����Ɏ��s���A�������1�‚݂̂̒l��Ԃ�
Throw OnError���\�b�h�݂̂����s
Timer ��莞�Ԍ�Ɉ�x�̂݁A�������͈�莞�Ԍ�Ɉ������Œl�𔭍s
ToAsync �w��X�P�W���[��*5��Ŏ��s���A�������1�‚݂̂̒l��Ԃ�Observable������Func�f���Q�[�g��Ԃ�
Using ������A�w�肵�����\�[�X��Dispose����t�@�N�g���E���\�b�h���쐬
Observable�I�u�W�F�N�g�����̂��߂�Observable�N���X�̐ÓI���\�b�h
*4 Windows Phone 7�ɓ�������Ă���Microsoft.Phone.Reactive�A�Z���u���ƁAData Developer Center�Ŕz�z����Ă���System.Reactive�A�Z���u���ł͋@�\���قȂ�B���̏ڍׂ͌�ŏڂ����q�ׂ�B
*5 �f�t�H���g�ł̓X���b�h�v�[���iThreadPool�j��Ŏ��s����AThread.Start���\�b�h��Task.Factory.StartNew���\�b�h�Ȃǂ́ARx�ł̑�ւƂȂ�B�X�P�W���[���Ɋւ��Ă͎���ȍ~�̘A�ڂŏڂ����q�ׂ�B

���\�b�h�� �@�\
ToObservable IEnumerable<T>�I�u�W�F�N�g��Observable�ɕϊ�
IEnumerable<T>�I�u�W�F�N�g�ւ̊g�����\�b�h

���\�b�h�� �@�\
ToObservable Task�I�u�W�F�N�g��Observable�ɕϊ�
Task�I�u�W�F�N�g�ւ̊g�����\�b�h
���uSystem.Reactive.Threading.Tasks�v�́uusing�v�^�uImports�v���K�v�B

�@�������ŏ��̃\�[�X�Ƃ��āAWhere���\�b�h��Select���\�b�h�Ȃǂ��Ȃ��݂̃N�G�����Z�q��ARx�����ɂ��鉉�Z�q��K�p�����Ă����A�l��ό`�����A�Ō��Subscribe���\�b�h�Œl��n���A�Ƃ����̂�Rx�̊�{�I�ȗ���ƂȂ�B

�@�Ⴆ�Ή��L�̃R�[�h�����s�����ꍇ�A���̉��̐}�̂悤�ȗ���ƂȂ�B

// ���s���ʁF4, 16
Observable.Range(1, 5)
  .Where(x => x % 2 == 0)
  .Select(x => x * x)
  .Subscribe(Console.WriteLine);
' ���s���ʁF4, 16
Observable.Range(1, 5).
  Where(Function(x) x Mod 2 = 0).
  Select(Function(x) x * x).
  Subscribe(AddressOf Console.WriteLine)
���Z�q��K�p���������\�b�h�E�`�F�[���̗�i��FC#�A���FVB�j

���\�b�h�E�`�F�[���ŗ����l�̃C���[�W
�uRange�v�̈�ԉE�̎l�p��OnCompleted���\�b�h�̌Ăяo����\���B

�@���̗�ł�Where���\�b�h��2�̔{���݂̂ɒl���t�B���^�����O���ASelect���\�b�h�Œl���悵�Ă���B

�@����ł͎��̃y�[�W����A�{�e�̎��ł���u�C�x���g��Rx�ň������@�v��������悤�B


�@INDEX
�@ �m�A�ځnReactive Extensions�iRx�j����
�@ ��2�� �C�x���g�E�v���O���~���O��Rx
  1�D��{�I�ȋL�q���@�^IObserver<T>�I�u�W�F�N�g�̏ڍׁ^�gDispose�h�̕K�v���^Observable�I�u�W�F�N�g�̐����q
�@   2�D�C�x���g�Ƃ͉����H �C�x���g��Rx�ň������Ƃ̗��_�^FromEvent���\�b�h��FromEventPattern���\�b�h
�@   3�D�����̂��߂̃��\�b�h

�C���f�b�N�X�E�y�[�W�w �@�u�A�ځFReactive Extensions�iRx�j����v


Insider.NET �t�H�[���� �V���L��
  • ��2��@�Ȍ��ȃR�[�f�B���O�̂��߂� �i2017/7/26�j
    �@�����_���ŋL�q�ł��郁���o�̑����Athrow���Aout�ϐ��A�^�v���ȂǁAC# 7�ɂ͈ȑO�����R�[�h���Ȍ��ɋL�q�ł���悤�ȋ@�\����������Ă���
  • ��1��@Visual Studio Code�f�o�b�O�̊�b�m�� �i2017/7/21�j
    �@Node.js�v���O�������f�o�b�O���Ȃ���AVisual Studio Code�ɓ�������Ă���f�o�b�O�@�\�̊�{�́u�L�v���}�X�^�[���悤
  • ��1��@���ĂȃR�[�f�B���O�̂��߂� �i2017/7/19�j
    �@C# 7�Œlj����ꂽ�V�@�\�̒�����A�u���l���e�����\���̉��P�v�Ɓu���[�J���֐��v���Љ��B�����͕�����₷���R�[�h���L�q����̂Ɏg����
  • Presentation Translator �i2017/7/18�j
    �@Presentation Translator��PowerPoint�p�̃A�h�C���B�v���[���e�[�V�������̎����̕t����A������ł̎��^�����A�X���C�h�̖|����s����
��IT���[���}�K�W���@�V������X�^�b�t�̃R���������[���œ͂��܂��i�����j

���ڂ̃e�[�}

Insider.NET �L�������L���O

�{�� ����