Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Egy tevékenység végrehajtása előtt a munkafolyamat-futtatókörnyezet a végrehajtás fenntartásához szükséges összes információt lekéri a tevékenységről. A munkafolyamat-futtatókörnyezet ezeket az információkat a metódus végrehajtása CacheMetadata során kapja meg. A metódus alapértelmezett implementációja biztosítja a futtatókörnyezet számára a tevékenység által a végrehajtáskor közzétett összes nyilvános argumentumot, változót és gyermektevékenységet; ha a tevékenységnek ennél több információt kell adnia a futtatókörnyezetnek (például a privát tagoknak vagy a tevékenység által ütemezendő tevékenységeknek), ezt a módszert felül lehet bírálni annak biztosításához.
A CacheMetadata alapértelmezett viselkedése
A CacheMetadata folyamatokból származó tevékenységek alapértelmezett implementációja NativeActivity a következő módon dolgozza fel az alábbi metódustípusokat:
InArgument<T>, , OutArgument<T>vagy InOutArgument<T> (általános argumentumok): Ezek az argumentumok a futtatókörnyezet számára olyan argumentumokként jelennek meg, amelyek neve és típusa megegyezik a közzétett tulajdonság nevével és típusával, a megfelelő argumentum irányával és néhány érvényesítési adattal.
Variable vagy annak bármely alosztálya: Ezek a tagok nyilvános változókként vannak kitéve a futtatókörnyezetnek.
Activity vagy annak bármely alosztálya: Ezek a tagok nyilvános gyermektevékenységként vannak kitéve a futtatókörnyezetnek. Az alapértelmezett viselkedés kifejezetten implementálható úgy, hogy AddImportedChild-t meghívjuk, és átadjuk a gyermek aktivitást.
ActivityDelegate vagy annak bármely alosztálya: Ezek a tagok nyilvános delegáltként kerülnek a végrehajtókörnyezetbe.
ICollection típusú Variable: A gyűjtemény minden eleme nyilvános változóként jelenik meg a futtatókörnyezetben.
ICollection típusú Activity: A gyűjtemény minden eleme nyilvános gyermekként jelenik meg a futtatókörnyezetben.
ICollection típusú ActivityDelegate: A gyűjtemény minden eleme nyilvános meghatalmazottként jelenik meg a futtatókörnyezetben.
A CacheMetadata a Activity, CodeActivity és AsyncCodeActivity származó tevékenységekre ugyanúgy működnek, mint fent, kivéve a következő különbségeket:
Az osztályok, amelyek a Activity származnak, nem tudják ütemezni a gyermektevékenységeket vagy meghatalmazottakat, így az ilyen tagok importált gyermekként és meghatalmazottként vannak megjelenítve.
Azok az osztályok, amelyek a CodeActivity és a AsyncCodeActivity osztályokból származnak, nem támogatják a változókat, gyermekeket vagy delegáltakat, ezért csak az argumentumok lesznek közzétéve.
A CacheMetadata felülírása a futtatókörnyezet információinak megadásához
Az alábbi kódrészlet bemutatja, hogyan adhat hozzá információkat a tagokról egy tevékenység metaadataihoz a CacheMetadata metódus végrehajtása során. Vegye figyelembe, hogy a metódust arra hívják meg, hogy minden nyilvános adatot a tevékenységről tároljon.
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationChild(this._writeLine);
metadata.AddVariable(this._myVariable);
metadata.AddImplementationVariable(this._myImplementationVariable);
RuntimeArgument argument = new RuntimeArgument("MyArgument", ArgumentDirection.In, typeof(SomeType));
metadata.Bind(argument, this.SomeName);
metadata.AddArgument(argument);
}
A CacheMetadata használata a megvalósítás gyerekeinek felfedése érdekében
Annak érdekében, hogy a változókat használó tevékenység ütemezze az adatokat a gyermektevékenységeknek, a változókat implementációs változókként kell hozzáadni; a nyilvános változók értékei nem állíthatók be így. Ennek az az oka, hogy a tevékenységeket inkább függvények implementációjaként (amelyek paraméterekkel rendelkeznek) hajtják végre, nem pedig beágyazott osztályokként (amelyek rendelkeznek tulajdonságokkal). Vannak azonban olyan helyzetek, amikor az argumentumokat explicit módon kell beállítani, például a ScheduleActivity használata során, mivel az ütemezett tevékenység nem fér hozzá a szülőtevékenység argumentumaihoz, mint ahogy egy gyermektevékenység tenné.
Az alábbi kódrészlet bemutatja, hogyan adhat át argumentumot natív tevékenységből egy ütemezett tevékenységbe a használatával CacheMetadata.
public sealed class ChildActivity : NativeActivity
{
public WriteLine _writeLine;
public InArgument<string> Message { get; set; }
private Variable<string> MessageVariable { get; set; }
public ChildActivity()
{
MessageVariable = new Variable<string>();
_writeLine = new WriteLine
{
Text = new InArgument<string>(MessageVariable),
};
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationVariable(this.MessageVariable);
metadata.AddImplementationChild(this._writeLine);
}
protected override void Execute(NativeActivityContext context)
{
string configuredMessage = context.GetValue(Message);
context.SetValue(MessageVariable, configuredMessage);
context.ScheduleActivity(this._writeLine);
}
}